Find object by key in array
by Maksim Kachurin
HTML
Array:
<br />[
<br />{name: "Carl", age: 14},
<br />{name: "Bruce", age: 23},
<br />{name: "Kate", age: 14},
<br />{name: "Santa",
<br /> age: 1000,
<br /> spec: {
<br /> fat: true
<br /> }
<br />}
<br />]
<br />
<br />Search:
<br />Test1: {'name': "Carl"}
<br />Test2: {'age': 14}
<br />Test3: {'age': 16}
<br />Test4: {'spec.fat': true}
<br />
<br />Founded indexes:
<br />
<span id="result"></span>
JavaScript
(function ($) {
$.findByKey = function (array, find) {
var result = [];
// для каждого обьекта в массиве
array.forEach(function (object, index) {
// пробегаемся по ключам которые ищем
for (var key in find) {
var value = find[key];
// парсим ключ на куски, т.к если ключ с точкой, значит искать надо вложенно
var key = key.split('.');
// клонируем обьект т.к тот нам еще понадобится для новых итераций и портить его нельзя
var temp = $.extend(true, {}, object);
key.forEach(function (keyv, keyi) {
//смотрим рекурсивно углубляясь существует ли искомый ключ в искомом обьекте
if (keyv in temp) {
temp = temp[keyv];
// если это последний элемент массива, сравниваем содержимое ветки
if (key.length - 1 === keyi && value == temp) {
// индекс дождался своего
result.push(index);
}
}
});
}
});
if (!result.length) {
result = null;
}
return result;
};
})(jQuery);
var arr = [{
name: "Carl",
age: 14
}, {
name: "Bruce",
age: 23
}, {
name: "Kate",
age: 14
}, {
name: "Santa",
age: 1000,
spec: {
fat: true
}
}],
test1 = {
name: "Carl"
},
test2 = {
age: 14
},
test3 = {
age: 16
},
test4 = {
'spec.fat': true
};
$('#result').append('Test1:' + $.findByKey(arr, test1) + '<br />');
$('#result').append('Test2:' + $.findByKey(arr, test2) + '<br />');
$('#result').append('Test3:' + $.findByKey(arr, test3) + '<br />');
$('#result').append('Test4:' + $.findByKey(arr, test4) + '<br />');