Вопрос по jquery, javascript, arrays – как предотвратить добавление повторяющихся ключей в массив JavaScript

28

Я нашел много связанных вопросов с ответами на циклы for ... for и использованием hasOwnProperty, но все, что я делаю, не работает должным образом. Все, что я хочу сделать, это проверить, существует ли ключ в массиве, и если нет, добавить его.

Я начинаю с пустого массива, затем добавляю ключи, поскольку страница очищается с помощью jQuery.

Сначала я надеялся, что что-то простое, подобное следующему, сработает: (используя общие имена)

if (!array[key])
   array[key] = value;

Нет идти За этим последовало:

for (var in array) {
   if (!array.hasOwnProperty(var))
      array[key] = value;
}

Также попробовал:

if (array.hasOwnProperty(key) == false)
   array[key] = value;

Ничего из этого не сработало. Либо в массив ничего не помещается, либо то, что я пытаюсь сделать, не лучше простого объявленияarray[key] = value Почему что-то так просто так сложно сделать. Есть идеи, чтобы сделать эту работу?

ты примеряешьArray или жеObject? thecodeparadox
ES6 теперь имеетSet родные Efren

Ваш Ответ

6   ответов
0

function check (list){
    var foundRepeatingValue = false;
    var newList = [];
    for(i=0;i<list.length;i++){
        var thisValue = list[i];
        if(i>0){
            if(newList.indexOf(thisValue)>-1){
                foundRepeatingValue = true;
                console.log("getting repeated");
                return true;
            }
       } newList.push(thisValue);
    } return false;
}

var list1 = ["dse","dfg","dse"];
check(list1);

Выход:

getting repeated
true
1

var names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];
var uniqueNames = [];
$.each(names, function(i, el){
if($.inArray(el, uniqueNames) === -1) uniqueNames.push(el);
});

Самый простой способ найти повторяющиеся значения в массиве JavaScript

0

x = ["a","b","c"]
x[0]     // "a"
x["0"]   // "a"
0 in x   // true
"0" in x // true
x.hasOwnProperty(0)   // true
x.hasOwnProperty("0") // true

Нет причин для проверкиkey (или жеindices для массивов) существование. Сейчас,values это другая история ...

Удачного кодирования

0

этому вместо объявления массивов рекомендуется использовать наборы, если вам нужен массив, в который не нужно добавлять дубликаты.

var array = new Set();
array.add(1);
array.add(2);
array.add(3);

console.log(array);
// Prints: Set(3) {1, 2, 3}

array.add(2); // does not add any new element

console.log(array);
// Still Prints: Set(3) {1, 2, 3}
27

var a = [1,2,3], b = [4,1,5,2];

b.forEach(function(value){
  if (a.indexOf(value)==-1) a.push(value);
});

console.log(a);
// [1, 2, 3, 4, 5]

Array.indexOf.

Если вы хотите положиться на jQuery, вместо этого используйтеjQuery.inArray:

$.each(b,function(value){
  if ($.inArray(value,a)==-1) a.push(value);
});

If all your values are simply and uniquely representable as stringsТем не менее, вы должны использовать объект вместо массива, для потенциальноmassive увеличение скорости (как описано в ответе @JonathanSampson).

Также проблема с использованиемindexOf является то, что он сам делает цикл ... Это делает дляSchlemiel the painter's algorithm это замедляется с каждым элементом, добавленным в массив.
37

это лучше сделать с помощью объекта, поскольку JavaScript не имеет ассоциативных массивов:

var foo = { bar: 0 };

Тогда используйтеin проверить на ключ:

if ( !( 'bar' in foo ) ) {
    foo['bar'] = 42;
}

Как было правильно указано в комментариях ниже, этот метод полезенonly когда ваши ключи будут строками или элементами, которые могут быть представлены в виде строк (например, чисел).

@Phrogz Абсолютно. Хороший совет ОП.
... предполагая, что ваши значения являются строками или могут быть представлены как уникальные строки (это включает числа).
Спасибо Джонатан. Свет наконец-то щелкнул о том, что я делаю неправильно. Я собирался сказать, что ваш ответ тоже не помог, но после небольшой детективной работы я рад сказать, что он работал отлично. И спасибо за советы по объектам. Я буду помнить об этом в будущем. iamsar

Похожие вопросы