Bir dizide benzersiz değerler nasıl elde edilir


168

Bir dizideki benzersiz değerlerin listesini nasıl alabilirim? Her zaman ikinci bir dizi kullanmak zorunda mıyım yoksa JavaScript'in java hashmap'ına benzer bir şey var mı?

Yalnızca JavaScript ve jQuery kullanacağım . Ek kitaplık kullanılamaz.


2
stackoverflow.com/questions/5381621/… - tam olarak ne düşündüğümü açıklıyor?
SpaceBison

1
underscore.jskütüphaneyi kullanmaya açık mısın?
jakee

bir java hashmap temelde bir javascript nesnesiyle aynıdır. sözdizimi {"key": "value", "key2": "value2"}
Ian

JavaScript / typescript toplama API'ler, Scala kıyasla korkunçlist.toSet
Ürdün Stewart

Yanıtlar:


120

@ Rocket'in cevabının yorumlarında bu konuya devam ettiğim için, kütüphane kullanmayan bir örnek de verebilirim. Bu, iki yeni prototip işlevi gerektirir containsveunique

Array.prototype.contains = function(v) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] === v) return true;
  }
  return false;
};

Array.prototype.unique = function() {
  var arr = [];
  for (var i = 0; i < this.length; i++) {
    if (!arr.contains(this[i])) {
      arr.push(this[i]);
    }
  }
  return arr;
}

var duplicates = [1, 3, 4, 2, 1, 2, 3, 8];
var uniques = duplicates.unique(); // result = [1,3,4,2,8]

console.log(uniques);

Daha fazla güvenilirlik containsiçin MDN indexOfşim ile değiştirebilir ve her bir elemanın indexOf-1'e eşit olup olmadığını kontrol edebilirsiniz : belgeler


1
~a.indexOf(b) === (a.indexOf(b) == -1)
Orwellophile

1
@Lexynux: geeky javascript-nerd cevabı, sadece ne anlama geldiğini anlayan biri tarafından kullanılmalı, muhtemelen o zaman bile değil. O ne söylediğini, bu yazı olduğunu if (~a.indexOf(b)) ...olduğunu özdeş uzun yazmaya if (a.indexOf(b) == -1) ....
Orwellophile

4
bunun yüksek çalışma süresi karmaşıklığı vardır (en kötü durum: O (n ^ 2))
Rahul Arora

1
bu gerçekten verimsiz bir uygulamadır. zaten bir öğe içerip içermediğini görmek için sonuç dizisini kontrol etmek korkunçtur. daha iyi bir yaklaşım, sayıları izleyen bir nesne kullanmak veya aux depolama kullanmak istemiyorsanız, önce O (n log n) sonra lineer bir süpürmeye göre sıralayın ve yan öğeleri karşılaştırın.
Isaiah Lee

1
Gerçekten "içerir" fonksiyonuna ihtiyacımız var mı?
Animesh Kumar

206

Veya mevcut tarayıcılarla uyumlu tek katmanlı (basit ve işlevsel) arayanlar için :

let a = ["1", "1", "2", "3", "3", "1"];
let unique = a.filter((item, i, ar) => ar.indexOf(item) === i);
console.log(unique);

Güncelleme 18-04-2017

Görünüşe göre 'Array.prototype.includes' artık ana tarayıcıların son sürümlerinde yaygın bir desteğe sahip ( uyumluluk )

Güncelleme 29-07-2015:

Tarayıcıların çalışmalarında standart bir 'Array.prototype.includes' yöntemini desteklemesi için planlar var, ancak bu soruya doğrudan cevap vermiyor; genellikle ilişkilidir.

Kullanımı:

["1", "1", "2", "3", "3", "1"].includes("2");     // true

Pollyfill ( tarayıcı desteği , mozilla kaynağı ):

// https://tc39.github.io/ecma262/#sec-array.prototype.includes
if (!Array.prototype.includes) {
  Object.defineProperty(Array.prototype, 'includes', {
    value: function(searchElement, fromIndex) {

      // 1. Let O be ? ToObject(this value).
      if (this == null) {
        throw new TypeError('"this" is null or not defined');
      }

      var o = Object(this);

      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;

      // 3. If len is 0, return false.
      if (len === 0) {
        return false;
      }

      // 4. Let n be ? ToInteger(fromIndex).
      //    (If fromIndex is undefined, this step produces the value 0.)
      var n = fromIndex | 0;

      // 5. If n ≥ 0, then
      //  a. Let k be n.
      // 6. Else n < 0,
      //  a. Let k be len + n.
      //  b. If k < 0, let k be 0.
      var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

      // 7. Repeat, while k < len
      while (k < len) {
        // a. Let elementK be the result of ? Get(O, ! ToString(k)).
        // b. If SameValueZero(searchElement, elementK) is true, return true.
        // c. Increase k by 1.
        // NOTE: === provides the correct "SameValueZero" comparison needed here.
        if (o[k] === searchElement) {
          return true;
        }
        k++;
      }

      // 8. Return false
      return false;
    }
  });
}

Bu neredeyse kennebec kopya pastası, ama kuşkusuz diziyi kapatma yerine kullanmak yerine bir parametre olarak geçmek muhtemelen performansı artıracaktır.

- noktaları birleştirmediğimi söylemeliyim, sadece bir astar için tarandım, büyük bir gönderiye benzedi, bu yüzden atlandı, gitti ve alternatif bir kaynak buldu ve başkalarının hızlı bir şekilde bulması için yeniden gönderildi. Bununla birlikte, hakkınız; kennebec ile hemen hemen aynı.
Josh Mc

Nice - Dizide parametre olarak gönderilen filtrenin farkında değildi ve harici bir nesne üzerinde çalışmak istemedi. Bu tam olarak ihtiyacım olan şey - javascript sürümümün (eski xerces sürümü) bir süre yeni güzellikler olmayacak.
Gerard ONeill

1
@GerardONeill evet, bazı durumlarda çok hayati öneme sahiptir, örneğin işlevsel olarak zincirlenmişse ve .map (...). Filter (...)
Josh Mc

@Josh Mc, bir şekilde 'benzersiz' yöntemde 'içerir' kullanabilir misiniz?
vkelman

144

İşte ES6 için burada bulunmadığını gördüğüm çok daha temiz bir çözüm. Set ve forma operatörünü kullanır :...

var a = [1, 1, 2];

[... new Set(a)]

Hangi döndürür [1, 2]


1
Bu çok zekice!
Josh Mc

1
Şimdi, BU tek liner olduğunu!
Mac

11
Typescript'te, Array.from(... new Set(a))Set dolaylı olarak bir dizi türüne dönüştürülemediğinden kullanmanız gerekir. Sadece aklınızda bulunsun!
Zachscs

4
@Zachscs, bunu denediğimde derleme hatası aldım. Bunu mu demek istediniz Array.from(new Set(a))? İşe yarıyor gibi görünüyor.
adam0101

72

Bir Astar, Saf JavaScript

ES6 sözdizimi ile

list = list.filter((x, i, a) => a.indexOf(x) === i)

x --> item in array
i --> index of item
a --> array reference, (in this case "list")

resim açıklamasını buraya girin

ES5 sözdizimi ile

list = list.filter(function (x, i, a) { 
    return a.indexOf(x) === i; 
});

Tarayıcı Uyumluluğu : IE9 +


4
bunun neden oylandığından emin değilim. İlk başta biraz belirsiz olabilir ve belki de 'akıllı' olarak sınıflandırılabilir ve okumak için pragmatik değildir, ancak diğer cevapların çoğunun eksik olduğu beyan edici, yıkıcı olmayan ve özlüdür.
Larry

1
@Larry bu oy çok düşüktü çünkü aynı cevap bundan yıllar önce sağlanmıştı.
Alex Okrushko

@AlexOkrushko yeterince adil - biçimlendirilme biçimi nedeniyle bu cevabı kaçırdı
Larry

7
Her şeyi tek bir satıra koyarsanız her şey tek satırlıdır :-)
Gary McGill

Eşitlik a.indexOf(x) === inotunu eşitlemek üç eşit işareti iyi bir fikir olabilir.
treejanitor

21

EcmaScript 2016 kullanarak bunu basitçe yapabilirsiniz.

 var arr = ["a", "a", "b"];
 var uniqueArray = Array.from(new Set(arr)); // Unique Array ['a', 'b'];

Kümeler her zaman benzersizdir ve kullanarak Array.from()bir Kümeyi diziye dönüştürebilirsiniz. Referans için belgelere bir göz atın.

https://developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/Global_Objects/Array/from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /Ayarlamak


1
Kullanmanız gereken cevap budur. indexOf()cevaplar korkunç çünkü O (N ^ 2). Forma cevapları tamam ama büyük diziler için çalışmaz. Bu en iyi yaklaşım.
Timmmm

20

Şimdi ES6'da yeni tanıtılan ES6 işlevini kullanabiliriz

let items = [1,1,1,1,3,4,5,2,23,1,4,4,4,2,2,2]
let uniqueItems = Array.from(new Set(items))

OR tarafından Array spread sözdizimi tekrarlanabilir

let items = [1,1,1,1,3,4,5,2,23,1,4,4,4,2,2,2]; 
let uniqueItems = [...new Set(items)];

Benzersiz sonucu döndürür.

[1, 3, 4, 5, 2, 23]

1
En temiz çözüm!
Dimitris Filippou

Bunu destekleyen bir JS ortamında new Set(modern Angular / TypeScript gibi) gitmenin yolu budur
Don Cheadle

1
Set ve Map gibi yinelenebilirler üzerinde Array yayılımı sözdizimini de kullanabileceğinizi belirtmek gerekir: let items = [1,1,1,1,3,4,5,2,23,1,4,4,4,2,2,2]; let uniqueItems = [...new Set(items)];
jacobedawson

Bu ES6 cevaplarını seviyorum!
Glen Thompson

1
Bu @Adeel Imran'ın cevabı ile aynı. Lütfen mevcut cevaplarla tamamen aynı cevapları vermeyin.
Timmmm

16

Orijinal diziyi olduğu gibi bırakmak istiyorsanız,

ilkinin benzersiz öğelerini içeren ikinci bir diziye ihtiyacınız vardır.

Çoğu tarayıcıda şunlar bulunur Array.prototype.filter:

var unique= array1.filter(function(itm, i){
    return array1.indexOf(itm)== i; 
    // returns true for only the first instance of itm
});


//if you need a 'shim':
Array.prototype.filter= Array.prototype.filter || function(fun, scope){
    var T= this, A= [], i= 0, itm, L= T.length;
    if(typeof fun== 'function'){
        while(i<L){
            if(i in T){
                itm= T[i];
                if(fun.call(scope, itm, i, T)) A[A.length]= itm;
            }
            ++i;
        }
    }
    return A;
}
 Array.prototype.indexOf= Array.prototype.indexOf || function(what, i){
        if(!i || typeof i!= 'number') i= 0;
        var L= this.length;
        while(i<L){
            if(this[i]=== what) return i;
            ++i;
        }
        return -1;
    }

14

Bu günlerde, dizinizi benzersiz bir Kümeye dönüştürmek için ES6'nın Set veri türünü kullanabilirsiniz. Ardından, dizi yöntemlerini kullanmanız gerekiyorsa, onu Array'a dönüştürebilirsiniz:

var arr = ["a", "a", "b"];
var uniqueSet = new Set(arr); // {"a", "b"}
var uniqueArr = Array.from(uniqueSet); // ["a", "b"]
//Then continue to use array methods:
uniqueArr.join(", "); // "a, b"

1
Düzgün, bazı perfomance sayılarını görmek güzel olurdu, özellikle çok dinamik ve büyükse thoses kümelerini dönüştürmek bir performans hickup'ı olabilir, söylemenin tek yolu test etmektir :)
Astronot

2
Bir transpiler kullanıyorsanız veya onu destekleyen bir ortamdaysanız, aynı şeyi daha kısaca yapabilirsiniz:var uniqueArr = [...new Set(arr)]; // ["a", "b"]
Stenerson

Hey @Astronaut, dediğin gibi performans hakkında bazı testler yaptı mı?
alexventuraio

8

Javascript'te yerel değil, ancak birçok kütüphanede bu yöntem var.

Underscore.js _.uniq(array)( link ) oldukça iyi çalışıyor ( kaynak ).


Paylaşım için teşekkürler! Bu işlev, dizi ile birlikte yineleyici ve bağlamı v1.4.3'ten bağımsız değişken listesi olarak alır.
Kunj

6

JQuery kullanarak, yaptığım bir Array benzersiz işlevi:

Array.prototype.unique = function () {
    var arr = this;
    return $.grep(arr, function (v, i) {
        return $.inArray(v, arr) === i;
    });
}

console.log([1,2,3,1,2,3].unique()); // [1,2,3]

5
jQuery'yi bir temel javascript nesnesinin prototipinde kullanacaksanız, jQuery işlevi yazmak daha iyi olmayabilir $.uniqueArray(arr)mi? JQuery referanslarını Arrayprototipinde
gömmek

1
@jackwanders: Bu konuda şüpheli olan nedir? Sayfada jQuery varsa onu kullanalım.
Rocket Hazmat

Yazdığınız yeni benzersiz işlev artık jQuery'ye bağımlı; jQuery'nin burada kullanıldığından emin olmadan yeni bir siteye veya uygulamaya taşıyamazsınız.
jackwanders

2
benim amacım buydu; jQuery kullanacaksanız, işlevin kendisini jQuery'nin bir parçası haline getirin. Bir çekirdek nesnenin prototipini genişletecek olsaydım, işleri yeniden kullanılabilir tutmak için temel javascript'e bağlı kalırdım. Kodunuza başka biri bakıyorsa $.uniqueArray, jQuery'ye bağımlı olduğu açıktır ; daha az açıktır Array.prototype.unique.
jackwanders

1
@jackwanders: Sanırım. Ben her zaman jQuery kullandığım gibi, benim kodunda kullanın ve sadece prototypes genişletmek gibi . Ama şimdi anladığınızı anlıyorum. Bunu yine de burada bırakacağım.
Rocket Hazmat

6

İkinci dizi kullanarak kısa ve tatlı bir çözelti;

var axes2=[1,4,5,2,3,1,2,3,4,5,1,3,4];

    var distinct_axes2=[];

    for(var i=0;i<axes2.length;i++)
        {
        var str=axes2[i];
        if(distinct_axes2.indexOf(str)==-1)
            {
            distinct_axes2.push(str);
            }
        }
    console.log("distinct_axes2 : "+distinct_axes2); // distinct_axes2 : 1,4,5,2,3

Kısa? ve tatlı? En iyi çözümlere baktınız mı?
Alex Okrushko

5

Hızlı, kompakt, iç içe döngüler yok, sadece dizeler ve sayılarla değil, herhangi bir nesne ile çalışır, bir yüklem alır ve sadece 5 satır kod alır!

function findUnique(arr, predicate) {
  var found = {};
  arr.forEach(d => {
    found[predicate(d)] = d;
  });
  return Object.keys(found).map(key => found[key]); 
}

Örnek: Benzersiz öğeleri türe göre bulmak için:

var things = [
  { name: 'charm', type: 'quark'},
  { name: 'strange', type: 'quark'},
  { name: 'proton', type: 'boson'},
];

var result = findUnique(things, d => d.type);
//  [
//    { name: 'charm', type: 'quark'},
//    { name: 'proton', type: 'boson'}
//  ] 

Son yerine ilk benzersiz öğeyi bulmak istiyorsanız bir found.hasOwnPropery () ekleyin.


4

Array.some ve Array.reduce ile benzersiz bulmak için vanilya JS'ye ihtiyacınız var. ES2015 sözdizimi ile sadece 62 karakterdir.

a.reduce((c, v) => b.some(w => w === v) ? c : c.concat(v)), b)

Array.some ve Array.reduce, IE9 + ve diğer tarayıcılarda desteklenir. ES2015 sözdizimini desteklemeyen tarayıcılarda desteklenecek normal işlevler için yağ ok işlevlerini değiştirmeniz yeterlidir.

var a = [1,2,3];
var b = [4,5,6];
// .reduce can return a subset or superset
var uniques = a.reduce(function(c, v){
    // .some stops on the first time the function returns true                
    return (b.some(function(w){ return w === v; }) ?  
      // if there's a match, return the array "c"
      c :     
      // if there's no match, then add to the end and return the entire array                                        
      c.concat(v)}),                                  
  // the second param in .reduce is the starting variable. This is will be "c" the first time it runs.
  b);                                                 

https://developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/Global_Objects/Array/some https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects / Dizi / azaltın


4

Yukarıdaki çözümlerin çoğu yüksek çalışma süresi karmaşıklığına sahiptir.

İşte O (n) zamanındareduce işi kullanan ve yapabileceğiniz çözüm .

Array.prototype.unique = Array.prototype.unique || function() {
        var arr = [];
	this.reduce(function (hash, num) {
		if(typeof hash[num] === 'undefined') {
			hash[num] = 1; 
			arr.push(num);
		}
		return hash;
	}, {});
	return arr;
}
    
var myArr = [3,1,2,3,3,3];
console.log(myArr.unique()); //[3,1,2];

Not:

Bu çözüm indirgemeye bağlı değildir. Fikir bir nesne haritası oluşturmak ve benzersiz olanları diziye itmektir.


1

ES6 yolu:

const uniq = (arr) => (arr.filter((item, index, arry) => (arry.indexOf(item) === index)));

1

kullanabilirsiniz,

let arr1 = [1,2,1,3];
let arr2 = [2,3,4,5,1,2,3];

let arr3 = [...new Set([...arr1,...arr2])];

size benzersiz unsurlar verecek,

**> ama bir yakalama var,

bu "1" ve 1 için ve farklı elemanlardır, **

ikinci seçenek dizide filtre yöntemi kullanmaktır.


1

Yinelenen diziler girebilirsiniz ve aşağıdaki yöntem benzersiz öğeler içeren dizi döndürür.

function getUniqueArray(array){
    var uniqueArray = [];
    if (array.length > 0) {
       uniqueArray[0] = array[0];
    }
    for(var i = 0; i < array.length; i++){
        var isExist = false;
        for(var j = 0; j < uniqueArray.length; j++){
            if(array[i] == uniqueArray[j]){
                isExist = true;
                break;
            }
            else{
                isExist = false;
            }
        }
        if(isExist == false){
            uniqueArray[uniqueArray.length] = array[i];
        }
    }
    return uniqueArray;
}

0

Şimdiye kadar verilen çözümlerle ilgili tek sorun verimliliktir. Bununla ilgili endişeleriniz varsa (ve muhtemelen iç içe geçmelisiniz): * için, filtre * indexOf, grep * inArray için, hepsi diziyi birden çok kez yineler. Sen gibi çözümlerle tek bir döngü uygulayabilirsiniz bu ya bu


0
Array.prototype.unique = function () {
    var dictionary = {};
    var uniqueValues = [];
    for (var i = 0; i < this.length; i++) {
        if (dictionary[this[i]] == undefined){
            dictionary[this[i]] = i;
            uniqueValues.push(this[i]);
        }
    }
    return uniqueValues; 
}

0

Bu sorunu saf JS'de denedim. Aşağıdaki adımları takip ettim 1. Verilen diziyi sıralayın, 2. sıralanan dizi boyunca döngü yapın, 3. Önceki değeri ve sonraki değeri geçerli değerle doğrulayın

// JS
var inpArr = [1, 5, 5, 4, 3, 3, 2, 2, 2,2, 100, 100, -1];

//sort the given array
inpArr.sort(function(a, b){
    return a-b;
});

var finalArr = [];
//loop through the inpArr
for(var i=0; i<inpArr.length; i++){
    //check previous and next value 
  if(inpArr[i-1]!=inpArr[i] && inpArr[i] != inpArr[i+1]){
        finalArr.push(inpArr[i]);
  }
}
console.log(finalArr);

gösteri


0
function findUniques(arr){
  let uniques = []
  arr.forEach(n => {
    if(!uniques.includes(n)){
      uniques.push(n)
    }       
  })
  return uniques
}

let arr = ["3", "3", "4", "4", "4", "5", "7", "9", "b", "d", "e", "f", "h", "q", "r", "t", "t"]

findUniques(arr)
// ["3", "4", "5", "7", "9", "b", "d", "e", "f", "h", "q", "r", "t"]

0

Bir indexOföğenin ilk oluşumunu geri döndüreceğini aklınızda tutarak , böyle bir şey yapabilirsiniz:

Array.prototype.unique = function(){
        var self = this;
        return this.filter(function(elem, index){
            return self.indexOf(elem) === index;
        })
    }


0

Bu sorunun başka bir düşüncesi. İşte daha az kod ile bunu başarmak için ne yaptı.

var distinctMap = {};
var testArray = ['John', 'John', 'Jason', 'Jason'];
for (var i = 0; i < testArray.length; i++) {
  var value = testArray[i];
  distinctMap[value] = '';
};
var unique_values = Object.keys(distinctMap);

console.log(unique_values);


0

function findUnique(arr) {
  var result = [];
  arr.forEach(function(d) {
    if (result.indexOf(d) === -1)
      result.push(d);
  });
  return result;
}

var unique = findUnique([1, 2, 3, 1, 2, 1, 4]); // [1,2,3,4]
console.log(unique);


0

equalsİlkel ve özel nesneler için kullanılabilen özelleştirilebilir işlevli bir yaklaşım :

Array.prototype.pushUnique = function(element, equalsPredicate = (l, r) => l == r) {
    let res = !this.find(item => equalsPredicate(item, element))
    if(res){
        this.push(element)
    }
    return res
}

kullanımı:

//with custom equals for objects
myArrayWithObjects.pushUnique(myObject, (left, right) => left.id == right.id)

//with default equals for primitives
myArrayWithPrimitives.pushUnique(somePrimitive)

0

Cevabım benzersiz değerleri elde etmek için kullanır Array.filterve Array.indexOfyöntemler

array.filter((value, index, self)=>self.indexOf(value)===index)

Bir web sitesinde bu yaklaşımı gördüm ama kodları burada göründüğünden farklı. Kodu bir satıra sadeleştirdim ve burada yayınlayalım, böylece biri bundan faydalanacak

Not: Yaklaşımım Josh tarafından yayınlanan tek astar ile aynı veya aynı. Değişken isimleri kodumda açıklayıcı olduğu için burada bırakıyorum.


-1

Ben sadece yinelenenleri ortadan kaldırmak için doğrusal arama kullanabilirsiniz eğer düşünüyordum:

JavaScript:
function getUniqueRadios() {

var x=document.getElementById("QnA");
var ansArray = new Array();
var prev;


for (var i=0;i<x.length;i++)
  {
    // Check for unique radio button group
    if (x.elements[i].type == "radio")
    {
            // For the first element prev will be null, hence push it into array and set the prev var.
            if (prev == null)
            {
                prev = x.elements[i].name;
                ansArray.push(x.elements[i].name);
            } else {
                   // We will only push the next radio element if its not identical to previous.
                   if (prev != x.elements[i].name)
                   {
                       prev = x.elements[i].name;
                       ansArray.push(x.elements[i].name);
                   }
            }
    }

  }

   alert(ansArray);

}

HTML:

<body>

<form name="QnA" action="" method='post' ">

<input type="radio"  name="g1" value="ANSTYPE1"> good </input>
<input type="radio" name="g1" value="ANSTYPE2"> avg </input>

<input type="radio"  name="g2" value="ANSTYPE3"> Type1 </input>
<input type="radio" name="g2" value="ANSTYPE2"> Type2 </input>


<input type="submit" value='SUBMIT' onClick="javascript:getUniqueRadios()"></input>


</form>
</body>

-1

Sorunun tek astar çözümü:

var seriesValues = [120, 120, 120, 120];
seriesValues = seriesValues.filter((value, index, seriesValues) => (seriesValues.slice(0, index)).indexOf(value) === -1);
console.log(seriesValues);

Bunu tarayıcı konsoluna yapıştırın ve sonuçları alın, yo :-)


-2

ben dahili JQuery Benzersiz işlevi var.

uniqueValues= jQuery.unique( duplicateValues );

Daha fazla bilgi için jquery API Belgelerine bakabilirsiniz.

http://api.jquery.com/jquery.unique/


8
Bunun yalnızca DOM öğeleri dizilerinde çalıştığını, dizelerin veya sayıların üzerinde çalışmadığını unutmayın. - dokümantasyondan alıntı.
mco
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.