.grep на объекте JSON
Я пытаюсь использовать grep для фильтрации Javascript-объекта так:
var options = {
5: {
group: "2",
title: "foo"
},
9: {
group: "1",
title: "bar"
}
};
var groups = $.grep(options, function(e){ return e.group == 2 });
Я получаю пустые результаты, и я предполагаю, что это имеет какое-то отношение к непоследовательным клавишам закрывающего объекта. Любые идеи, как это исправить?
Update
Я попробовал несколько разных методов grep, включая использование
for (key in option)
чтобы grep по опции [key], но я не мог заставить его работать. В итоге я пошел другим путем, как показано здесь:
var option_ids = new Array();
for (key in option) {
if ( option[key]['group'] == 2 ) option_ids.push(option[key]['id']);
}
Ответы
Ответ 1
Вы не можете grep по объекту и ожидать разумного результата. Однако вы можете grep
по массиву, поэтому нам просто нужно получить список ключей с Object.keys
:
$.grep(Object.keys(options), function (k) { return options[k].group == 2; })
//=> ["5"]
Ответ 2
это функция фильтра для фильтрации как массивов, так и объектов:
function filter(target, func) {
if (target instanceof Array) {
return target.filter(func);
} else {
var result = {};
$.each(Object.keys(target).filter(function (value) {
return func.call(null, target[value]);
}), function (i, value) {
result[value] = target[value];
});
}
}