之前可能已经问了很多次,但我找不到合适的解决方案。
我有一个类似于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
}]);
这将深埋在大型应用程序中,我需要一种快速获取项目键的方法,以便我可以轻松操作范围
答案 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" }]