2015-02-26 2 views
0

Итак, у меня есть массив объектов, и я хочу получить объект с ключом «Z».Получите объект в массиве объектов с ключом

Очевидно, что я могу просто цикл по массиву и проверять каждую клавишу по одному и захватить тот, который соответствует, но я думал, что есть, вероятно, лучше, чем мой нынешний подход:

for (var i = 0; i < data.length; i++) { 
    if (Object.keys(data[i]).toString() == "z") { 
     return data[i].z; 
     break; 
    } 
} 

Мои данные:

"data": [ 
    { "X": { "foo": "bar1" } }, 
    { "Y": { "foo": "bar2" } }, 
    { "Z": { "foo": "bar3" } } 
] 

Желаемая Выход:

{ 
    "foo": "bar3" 
} 
+2

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

+2

Реорганизуйте свои данные в один объект вместо массива объектов. – Blazemonger

+2

Объект javascript - это карта. Поиск карты - O (1). Поиск в массиве - O (n). –

ответ

2

Вместо того, чтобы массив объектов , Вы можете заменить его на объект:

"data": { 
    "X": { "foo": "bar1" }, 
    "Y": { "foo": "bar2" }, 
    "Z": { "foo": "bar3" } 
} 

А затем получить доступ к объекту, как так:

data['Z'] 

, как вы можете видеть, много аккуратнее.

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

data['A'] = { "foo": "bar4" }; 

создаст в данных ключей "A", и вы все еще можете перебрать ваш объекта с помощью for (... in ...) петли, то есть:

for (key in data) { 
    console.log(data[key].foo); 
} 

должен печатать

bar1 
bar2 
bar3 
bar4 
0

Использование lodash, вы могли бы сделать что-то вроде:

var collection = [ 
    { X: { foo: 'bar1' } }, 
    { Y: { foo: 'bar2' } }, 
    { Z: { foo: 'bar3' } } 
]; 

_(collection) 
    .chain() 
    .find(_.ary(_.partialRight(_.has, 'Z'), 1)) 
    .values() 
    .first() 
    .value() 
// → { foo: 'bar3' } 

набросок того, что делает эта цепочка:

  1. chain(): Включает явное формирование цепочки. В противном случае find() вернет развернутый объект, и у нас еще есть действия для выполнения.
  2. find(): Мы передаем обратный вызов, который проверяет наличие ключа Z. Сам обратный вызов сконструирован с использованием утилит функций более высокого порядка:
    • ary(): Ограничивает количество аргументов, переданных функции. Мы делаем это здесь, потому что find() передает аргументы, которые мы не заботимся о нашем обратном вызове.
    • partialRight(): Предоставляет аргумент 'Z' функции has(). Это самый правый аргумент, означающий, что каждый элемент в коллекции передается как аргумент.
    • has(): Возвращает true, если на объекте существует ключ Z.
  3. values(): Нам не нужен ключ объекта, только его значения.
  4. first(): Функция values() возвращает коллекцию, но нам нужен только первый элемент. Там должно быть только один предмет в коллекции.
Смежные вопросы