5

这可能已经被问过很多次了,但我很难找到一个像样的解决方案。

我有一个类似于这个的 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 提供的答案为 Angular 创建了一个简洁的小模块。由于我正在处理对象,因此我想要一种以类似于 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
    }]);

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

4

3 回答 3

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});
于 2013-08-27T16:19:47.127 回答
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
于 2013-08-27T16:19:58.507 回答
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" }]
于 2013-08-27T17:45:43.930 回答