2015-08-03 2 views
0

есть ли эквивалент cakePHPs set :: extract function (http://book.cakephp.org/2.0/en/core-utility-libraries/set.html#Set::extract)?Получите все значения в массиве объектов с определенным ключом (set :: extract cakephp эквивалент)

Что у меня есть что-то вроде этого:

var arr = [{name: "test", children: [id: 1, title: "title1"]}, 
      {name: "test2", children: [id: 2, title: "title2"]}, 
      {name: "lipsum", children: [id: 1, title: "title1", id: 2, title: "title2"]}, 
      {name: "lipsum2", children: [id: 3, title: "title3"]}] 

Что я хочу сделать, это:

var objs = filter({arr.children.id:1}); 

Результат 'OBJS' должно быть:

[{name: "test", children: [id: 1, title: "title1"]}, 
{name: "lipsum", children: [id: 1, title: "title1", id: 2, title: "title2"]}] 

Заранее спасибо.

+0

Есть ** нет ассоциативных массивов в JavaScript **, только на основе индексов, начиная с 0. – connexo

+0

Yep моя ошибка ... конечно, это должен быть массив объектов – Thinklabs

ответ

0

У вас есть недопустимая структура объекта ... что дочерний массив должен быть фактически объектом. Тогда вы можете сделать:

var filtered = arr.filter(function(item) { 
    return item.children.filter(function(child) { 
     return child.id === 1; 
    }).length 
}); 

Правильный формат данных:

[{ 
    name: "test", 
    children: [{ 
     id: 1, 
     title: "title1" 
    }] 
}] 

Демо: http://jsfiddle.net/588o5p69/

+0

И если предположить, что 'children' фактически является массивом объектов, вы также можете сделать return (item.children || []). filter (child => child.id === 1) ' –

+0

Да, круто работает как charme, и никакая другая библиотека не нужна. – Thinklabs

+0

«что дочерний массив должен быть фактически объектом» - нет, он должен ** не ** быть объектом, а ** массивом объектов **. – connexo

0

Правильная структура для массива в JS должен быть таким:

var arr = [{name: "test", children: [ {id: 1, title: "title1" } ]}, 
      {name: "test2", children: [ { id: 2, title: "title2" } ]}, 
      {name: "lipsum", children: [ {id: 1, title: "title1"}, {id: 2, title: "title2"}]}, 
      {name: "lipsum2", children: [ {id: 3, title: "title3"} ]}]; 

На этой структуре вы можете просто использовать underscore's _.filter:

var resArr= _.filter(arr, function(elem){ return elem.children.id === 1; }); 

Если IE < 9 не имеет значения, вы можете также пойти с ECMA Script 5's native filter function:

var resArr= arr.filter(function(elem){ return elem.children.id === 1; }); 
+0

Спасибо за ваш ответ :). Даже это правильно, я предпочитаю встроенную функциональность js, указанную в tymeJV. – Thinklabs

+0

Я могу это уважать. Для будущих посетителей, ответ на который, вероятно, лучше всего будет отмечен как правильный ответ? – connexo

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