查找对象数组中的匹配对象?
问题描述:
var set = [{"color":"blue"},{"color":"green"},{"color":"red"},{"color":"green"}];
我希望能够做一些类似db调用的东西,set.find({"color":"green"})
并让它返回一个包含该属性的对象的数组。查找对象数组中的匹配对象?
答
使用Array#filter
,对于这种特殊情况下的代码看起来像
var results = set.filter(function (entry) { return entry.color === "green"; });
Array#filter
没有在一些较旧的浏览器中实现,故见链接的文章的向后兼容性垫片,或更好,但得到a full-fledged ES5 shim。
对于更一般的情况下,它只是一个扩大这个想法的事情:
function findByMatchingProperties(set, properties) {
return set.filter(function (entry) {
return Object.keys(properties).every(function (key) {
return entry[key] === properties[key];
});
});
}
var results = findByMatchingProperties(set, { color: "green" });
,我再次使用ECMAScript 5种方法Object.keys
和Array#every
,所以使用ES5垫片。 (该代码是没有ES5垫片是可行的,但使用手动的循环,并且要少得多写和读的乐趣)
答
既然你已经包括了jQuery的标签,这里有一个办法做到这一点使用jQuery的map
:
var results = $.map(set, function(e,i){
if(e.color === 'green') return e;
});
该文档声明您需要返回null
以从数组中移除该元素,但显然这是错误的,如注释中的jsFiddle所示;什么都不返回(即返回undefined
)也同样适用。
答
我已经使用jQuery的从地图功能,我得到通过选择通过索引中键值以便通过使用该索引我们会从阵列获得所需的对象。
var mydata = [{ name: "Ram", Id: 1 }, { name: "Shyam", Id: 2 }, { name: "Akhil", Id: 3 }];
searchKey = 2
var mydata = [{ name: "Ram", Id: 1 }, { name: "Shyam", Id: 2 }, { name: "Akhil", Id: 3 }];
searchKey = 2
var selectedData = mydata[mydata.map(function (item) { return item.Id; }).indexOf(searchKey)];
console.log(selectedData)
var selectedData = mydata[mydata.map(function (item) { return item.Id; }).indexOf(searchKey)];
console.log(selectedData)
output
{ name: "Shyam", Id: 2 }
Note: if you want to pass search key as object then
searchKey = { Id: 2 };
mydata[mydata.map(function (item) { return item.Id; }).indexOf(searchKey.Id)];
output
{ name: "Shyam", Id: 2 }
在http://*.com/questions/1820593/search-a-javascript-object – 2011-06-04 15:19:16
已经回答了这个例子不会返回整个对象, 可以? – fancy 2011-06-04 15:25:00
这与jQuery无关,因此您应该删除该标记。这纯粹是一个JavaScript问题。 – Domenic 2011-06-04 15:27:34