Учитывая следующие три объекта, как эффективен способ вернуть первый объект, который содержит пару ключ-значение?
var obj = {
item1: {
name: 'apple',
color: 'red'
},
item2: {
name: 'blueberry',
color: 'blue'
},
item3: {
name: 'cherry',
color: 'red'
}
};
var obj2 = {
collection: [
{
item1: {
name: 'apple',
color: 'red'
},
item2: {
name: 'blueberry',
color: 'blue'
},
item3: {
name: 'cherry',
color: 'red'
}
}
]
};
var obj3 = {
items: [
{
item1: {
name: 'apple',
color: 'red'
}
},
{
item2: {
name: 'blueberry',
color: 'blue'
},
},
{
item3: {
name: 'cherry',
color: 'red'
}
}
]
};
Я хотел бы получить те же результаты для следующих трех операторов:
getObject(obj, 'color', 'red');
getObject(obj2, 'color', 'red');
getObject(obj3, 'color', 'red');
Вывод:
{
name: 'apple',
color: 'red'
}
Вот что у меня есть, но я думаю, что где-то отсутствует замыкание, поскольку оно разрывается при вызове самой функции:
function getObject(arg, key, val) {
if (typeof arg!=='object') return null;
switch (Object.prototype.toString.call(arg)) {
case '[object Array]':
for (var i=0; i<arg.length; ++i) {
getObject(arg[i], key, val);
}
break;
case '[object Object]':
for (var i in arg) {
if (arg.hasOwnProperty(i)) {
if (typeof arg[i]==='object') {
getObject(arg[i], key, val);
} else {
if (i===key && arg[i]===val) {
return arg;
}
}
}
}
break;
}
}