Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按值查找嵌套对象并返回“查找对象”键_Javascript - Fatal编程技术网

Javascript 按值查找嵌套对象并返回“查找对象”键

Javascript 按值查找嵌套对象并返回“查找对象”键,javascript,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

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

我有一个类似于以下内容的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;
        }
    }
});

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

您可以通过向
数组添加函数来扩展
数组
对象。原型
,您可以使用
this
引用调用该函数的所有者

在find()方法中,可以利用函数筛选集合

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});

您需要在数组中循环并比较每个对象,以查看它是否包含要查找的密钥

这是我很快就搞定的东西

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;
        }
    }
};
与过滤器一起使用

$[?(@._id==123)]
提取id为123的元素。因此,您正在寻找函数

function find(array, id) {
    return jsonPath(array, '$[?(@._id==' + id + ')]');
}
用测试工具测试它。 确保首先转换为JSON:

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

回答得好,但既然这是一个学习的地方,我鼓励你用一些解释来回答,以帮助那些需要它的人。@peterchon更新了一点,希望它能有所帮助。仅供参考--
Array.prototype.Filter
在IE8及以下版本中不受支持。不确定这是否是原始海报的问题。@ LBSTR在JS 1.6中是可用的,我只考虑为真正的浏览器编写JS。@ SZA不幸的是,IE8对于很多开发人员来说仍然非常真实。我并不是故意说我是专门为你提供这些信息的。如果你知道你只想搜索
\u id
,我会寻找
数据之类的东西。相反,find(123)
,因为它比搜索具有未知属性的对象要快。结果对吗?0是_id:123的位置?有点像数据[0]?太棒了,这对我们的项目很有效。我不能将确切的代码作为一个更大的angular应用程序的一部分发布,但我将发布一个更简单的版本,根据您的回答改编:)很高兴我能帮忙!:-我用我的答案修正了我的问题;)看起来是一个很棒的库,但我只是需要一些东西来返回objects键
function find(array, id) {
    return jsonPath(array, '$[?(@._id==' + id + ')]');
}
[{ "_id": 123, "name": "Test"}, { "_id": 124, "name": "Test2" }]