Как предотвратить добавление дубликатов ключей в массив 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
Почему так просто так сложно сделать. Любые идеи, чтобы сделать эту работу?
Ответы
Ответ 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
Ответ 5
Вы можете попробовать следующее:
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