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 />&nbsp;&nbsp; age: 1000,
<br />&nbsp;&nbsp; spec: {
<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fat: true
<br />&nbsp;&nbsp;}
<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 />');