按值查找嵌套对象并返回找到的对象键

时间:2013-08-27 16:11:50

标签: javascript

之前可能已经问了很多次,但我找不到合适的解决方案。

我有一个类似于mongo查询的JSON结果:

var data = [{ _id: 123, name: "Test"}, { _id: 124, name: "Test2" }]

这是我所拥有的数据的一个非常简单的版本,我需要能够在数组中查找和对象匹配“_id”属性,如

data.find({ _id: 123 }); // returns 0
data.find({ _id: 124 }); // returns 1

如果有人知道一个很好的解决方案,我们将不胜感激。

更新

我已经使用@Rocket Hazmat提供的答案为角度创建一个整洁的小模块。由于我正在使用对象,我想要一种以类似于mongo的方式查询json的方法。

angular.module("myModule").factory("obj", function() {
    return {
        findKey: function(query, data) {
            for (var i = 0, l = data.length; i < l; i +=1) {
                var item = data[i],
                    match = true;
                // Check each object
                for (var x in query) {
                    if (item[x] !== data[x]) {
                        match = false;
                        break;
                    }
                }
                // Did it match ?
                if (match) {
                    return i;
                }
            }
            return false;
        }
    }
});

然后我可以在我的控制器中使用它:

angular.module("myModule")
    .controller("mainCtrl", ["$scope", "obj", function($scope, $obj) {
        // This would be the result of an ajax request
        $scope.people = [
            { _id: 1, name: "Test1" },
            { _id: 2, name: "Test2" },
            { _id: 3, name: "Test3" }
        ];

        $obj.findKey({ _id: 1, name: "Test1" }, $scope.people); // 0
        $obj.findKey({ _id: 2 }, $scope.people); // 1
        $obj.findKey({ name: "Test2"}, $scope.people); // 1
        $obj.findKey({ _id: 3, name: "Test3" }, $scope.people); // 2
        $obj.findKey({ _id: 3, name: "Test1" }, $scope.people); // false
    }]);

这将深埋在大型应用程序中,我需要一种快速获取项目键的方法,以便我可以轻松操作范围

3 个答案:

答案 0 :(得分:2)

您可以通过向Array添加功能来扩展Array.prototype对象的新功能,并且您可以使用this来引用所有者哪些来电功能。

在find()方法中,您可以使用filter()函数来过滤集合。

var data = [{ _id: 123, name: "Test"}, { _id: 124, name: "Test2" }]

Array.prototype.find = function(obj){
    return this.filter(function(item){
        return (item._id === obj._id);
    });
}

var result = data.find({_id: 123});

答案 1 :(得分:2)

你需要循环遍历数组并比较每个对象,看它是否包含你正在寻找的密钥。

这是我快速入侵的事情。

Array.prototype.find = function(obj){
    // Loop through array
    for(var i = 0, len = this.length; i < len; i++){
        var ele = this[i],
            match = true;
        // Check each object
        for(var x in obj){
            if(ele[x] !== obj[x]){
                match = false;
                break;
            }
        }
        // Did it match?
        if(match){
            return i;
        }
    }
};

然后就像你展示的那样运行它:

data.find({ _id: 124 }); // 1

答案 2 :(得分:0)

JsonPath与过滤器一起使用

$[?(@._id==123)]

提取id 123 的元素。所以你正在寻找功能

function find(array, id) {
    return jsonPath(array, '$[?(@._id==' + id + ')]');
}

使用JSONPath Online Evaluator进行测试。 确保首先转换为JSON:

[{ "_id": 123, "name": "Test"}, { "_id": 124, "name": "Test2" }]