var set = [{"color":"blue"},{"color":"green"},{"color":"red"},{"color":"green"}];
我希望能够执行诸如 db 调用之类的操作,set.find({"color":"green"})并让它返回一个充满包含该属性的对象的数组。
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某些较旧的浏览器中未实现,因此请参阅链接文章以获取向后兼容性垫片,或者更好地获得完整的 ES5 垫片。
对于更一般的情况,这只是扩展这个想法的问题:
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 shim 的情况下是可行的,但使用手动循环并且编写和阅读的乐趣要少得多。)
我使用了 jquery 的 map 函数,我通过传递搜索的键值来获取选定的索引,因此通过使用该索引,我们将从数组中获取所需的对象。
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 }
由于您已经包含了 jQuery 标记,这里是使用 jQuery 的一种方法map:
var results = $.map( set, function(e,i){
if( e.color === 'green' ) return e;
});
文档指出您需要返回null以从数组中删除元素,但显然这是错误的,如注释中的 jsFiddle 所示;不返回任何内容(即返回undefined)也同样有效。
使用带有隐含return和简洁主体的箭头函数:
const results = set.filter(entry => entry.color === "green");
另一个传入搜索变量的示例:
const searchString = 'green';
const results = set.filter(entry => entry.color === `${searchString}`);
在MDN上阅读有关箭头函数的更多信息