Javascript 按值查找嵌套对象并返回“查找对象”键
这可能已经被问过好几次了,但我很难找到一个像样的解决方案 我有一个类似于以下内容的mongo查询的JSON结果: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
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" }]