2017-02-03 3 views
1

Я долгое время царапал себе голову этим, даже жестким, это была легкая задача. У меня есть массив с набором объектов. Массив выглядит следующим образом:Как сравнить значения между объектами в массиве?

[ { key1: 'ok', key2: 'ok', key3: '--' }, 
    { key1: 'ok', key2: '--', key3: 'ok' }, 
    { key1: 'ok', key2: 'ok', key3: '--' } ] 

Я хочу функцию, которая сравнивает объекты, и возвращает ключ, который имеет все «ок», как это значение. В этом случае, я хотел бы, чтобы вернуть

key1 

Я наблюдал Compare objects in an array для вдохновения, но он просто не делает этого.

Есть ли у кого-нибудь предложения? Была бы жизнь заставка

+2

Если вы можете использовать ES6: 'arr.reduce ((S, O) => (Object.keys (о) .filter (k => o [k]! == 'ok'). forEach (k => s.delete (k)), s), новый Set (Object.keys (arr [0]))); 'https://jsfiddle.net/qemuyf3f/1/ –

ответ

2

Вы можете выполнять итерацию массива и фильтровать ключи.

var array = [{ key1: 'ok', key2: 'ok', key3: '--' }, { key1: 'ok', key2: '--', key3: 'ok' }, { key1: 'ok', key2: 'ok', key3: '--' }], 
 
    result = array.reduce(function (r, o) { 
 
     return r.filter(function (k) { 
 
      return o[k] === 'ok'; 
 
     });  
 
    }, Object.keys(array[0])); 
 

 
console.log(result);

ES6

var array = [{ key1: 'ok', key2: 'ok', key3: '--' }, { key1: 'ok', key2: '--', key3: 'ok' }, { key1: 'ok', key2: 'ok', key3: '--' }], 
 
    result = array.reduce((r, o) => r.filter(k => o[k] === 'ok'), Object.keys(array[0])); 
 

 
console.log(result);

+1

Интересный подход @Nina! Не думал бы начать с полного списка и отфильтровывать, как вы итерации ... – rasmeister

+0

@rasmeister, это не обязательно полный список, но в любом случае он выполняет и выполняет по крайней мере ключ, который является общим и имеет желаемый стоимость. –

1

Скорее всего не кратчайшее решение, но должно быть легко следовать ..

var obj = [ { key1: 'ok', key2: 'ok', key3: '--' }, 
 
    { key1: 'ok', key2: '--', key3: 'ok' }, 
 
    { key1: 'ok', key2: 'ok', key3: '--' } ]; 
 

 
var keycount = {}; 
 

 
obj.forEach((o) => { 
 
    Object.keys(o).forEach((key) => { 
 
    if (o[key] === 'ok') 
 
     keycount[key] = (keycount[key] || 0) + 1; 
 
    }); 
 
}); 
 
Object.keys(keycount).forEach((key) => { 
 
    if (keycount[key] === obj.length) 
 
    console.log(`Found ${key}`); 
 
});

1

Предполагая, что все объекты имеют одинаковые ключи:

for (var key in arr[0]){ 
    var allok = true; 
    for (var i = 0; i < arr.length; i++){ 
     if (arr[i][key] !== "ok") { 
      allok = false; 
      break; 
     } 
    } 
    if (allok) {console.log(key);} 
    } 
+0

То же самое здесь. Попробуйте сделать рабочий фрагмент. На самом деле проще, чем использовать блок кода, просто нажмите кнопку '<>'. – Keith

1

Вот что я хотел бы сделать:

var objs = [ { key1: 'ok', key2: 'ok', key3: '--' }, 
 
    { key1: 'ok', key2: '--', key3: 'ok' }, 
 
    { key1: 'ok', key2: 'ok', key3: '--' } ]; 
 

 
var getOkKeys = function(objs) { 
 
    return Object.keys(objs[0]).reduce(function(results, key) { 
 
    if (objs.every(function(obj) { return (obj[key] === 'ok'); })) { 
 
     results.push(key); 
 
    } 
 
    return results; 
 
    }, []); 
 
}; 
 

 
console.log(getOkKeys(objs));

В соответствии с просьбой, функция, которая возвращает ключи - getOkKeys().

+0

Хорошее решение. Чтобы сделать что-то немного лучше, в будущем попробуйте сделать рабочий фрагмент. Это символ '<>. Я на этот раз сделал это для вас. – Keith

+0

Спасибо @Keith. Хороший совет – rasmeister

Смежные вопросы