Подтвердить что ты не робот

Как предотвратить добавление дубликатов ключей в массив javascript

Я нашел много связанных вопросов с ответами, говорящими о... в циклах и использованием 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 Почему так просто так сложно сделать. Любые идеи, чтобы сделать эту работу?

4b9b3361

Ответ 1

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

var foo = { bar: 0 };

Затем используйте in для проверки ключа:

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

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

Ответ 2

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);
});

Если все ваши значения просто и однозначно представлены в виде строк, однако вы должны использовать объект вместо массива для потенциально значительного увеличения скорости (как описано в ответе @JonathanSampson).

Ответ 3

Логика неверна. Рассмотрим это:

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

Нет причин для цикла для проверки существования ключа (или индексов для массивов). Теперь значения - это другая история...

Счастливое кодирование

Ответ 4

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