Проверить, существует ли ключ объекта внутри массива
Я пытаюсь взять некоторые данные из существующего объекта и сгруппировать его в новый. Проблема, с которой я столкнулась, - проверить, существует ли ключ объекта, чтобы я мог либо создать новый, либо добавить данные в существующий.
Я нашел несколько похожих вопросов, но ни один из ответов не работал, поэтому я немного застрял. Это всегда заканчивается тем, что он не существует и создает повторяющиеся ключи.
У меня есть следующий код, где xxx
есть где мне нужно проверить, существует ли ключ:
var groups = [];
for (var i=0; i<something.length; i++) {
var group_key = 'group_'+something[i].group_id;
if (xxx) {
// New group
var group_details = {};
group_details[group_key] = {
group_name: something[i].group_name,
items: [
{ 'name': something[i].name }
]
};
groups.push(group_details);
} else {
// Existing group
groups[group_key].items.push({
'name': something[i].name
});
}
}
something
Я проходил мимо, довольно просто, в основном в форме:
[
{
group_id: 3,
group_name: 'Group 3',
name: 'Cat'
},
{
group_id: 3,
group_name: 'Group 3',
name: 'Horse'
},
{
group_id: 5,
group_name: 'Group 5',
name: 'Orange'
}
]
Ответы
Ответ 1
Лучший способ достичь этого - полагаться на то, что оператор in
возвращает логическое значение, указывающее, присутствует ли ключ в объекте.
var o = {k: 0};
console.log('k' in o); //true
Но это не единственная проблема, у вас нет объекта поиска, который позволяет вам проверить, присутствует ли ключ или нет. Вместо использования массива используйте простой объект.
var groups = {};
Затем вместо groups.push(...)
выполните groups[group_key] = group_details;
Затем вы можете проверить, существует ли группа, выполнив if (group_key in groups) {}
Ответ 2
Я много раз сталкивался с этим шаблоном, и в итоге я делаю следующее:
if (object[key]) {
//exists
} else {
// Does not exist
}
поэтому я думаю, что в вашем случае это будет:
if (groups[group_key]) {
// Exists
} else {
// Does not exist
}
Ответ 3
let data = {key: 'John'};
console.log( data.hasOwnProperty('key') );
Ответ 4
Вы можете использовать функцию hasOwnProperty().
var groups = [];
for (var i=0; i<something.length; i++) {
var group_key = 'group_'+something[i].group_id;
if (!groups.hasOwnProperty(group_key)) {
// New group
var group_details = {};
group_details[group_key] = {//maybe change to group_details =
group_name: something[i].group_name,
items: [
{ 'name': something[i].name }
]
};
//groups.push(group_details);
//change it to
groups[group_key] = group_details;
} else {
// Existing group
groups[group_key].items.push({
'name': something[i].name
});
}
}
Ответ 5
вы могли бы получить ключи от объекта и выполнить итерацию по списку и посмотреть, существует или нет ключ:
var keys=Object.keys(object)
for(var i=0;i<keys.length;i++){
if(keys[i]=="your key"){//check your key here}
}
Ответ 6
ExampleArray
[0] => siteoverlay
[1] => overlaycenter
[2] => someelementid
Решение A
расширьте прототип, если хотите, (функция здесь с циклом while, которая намного быстрее, чем для):
if (!('getKey' in Object.prototype)) {
Object.prototype.getKey = function(obj) {
var i=this.length;
while(i--)
{ if(this[i]===obj)
{return i;}
return;
}
};
}
то вы можете использовать:
alert(exampleArray.getKey("overlaycenter"));
возвращает: 1
Решение B
также с расширением прототипа:
if(!('array_flip' in Array.prototype)){
Array.prototype.array_flip=function(array) {
tmp_ar={}; var i = this.length;
while(i--)
{ if ( this.hasOwnProperty( i ) )
{ tmp_ar[this[i]]=i; }
} return tmp_ar;
};
}
а затем вы можете использовать:
alert(exampleArray.array_flip(exampleArray['someelementid']);
возвращает: 2
Решение C
обнаружен без добавления прототипа, он также функционален
и, в конечном итоге, лучше для совместимых скриптов, поскольку все говорят, что не продлить прототип... и так... да, если вы хотите использовать его с легким 1 лайнером, вы можете использовать:
function array_flip( array )
{ tmp_ar={}; var i = array.length;
while(i--)
{ if ( array.hasOwnProperty( i ) )
{ tmp_ar[array[i]]=i; }
} return tmp_ar;
}
И
alert(array_flip(exampleArray)['siteoverlay']);
возвращает 0
Ответ 7
Вы должны использовать оператор in
key in object //true
!(key in object) //false
И undefined
нельзя использовать
obj["key"] !== undefined //false, but the key in the object
Для получения дополнительной информации, пожалуйста, посмотрите Проверка наличия ключа в объекте JavaScript?