Проверить, существует ли ключ объекта внутри массива

Я пытаюсь взять некоторые данные из существующего объекта и сгруппировать его в новый. Проблема, с которой я столкнулась, - проверить, существует ли ключ объекта, чтобы я мог либо создать новый, либо добавить данные в существующий.

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

У меня есть следующий код, где 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?