2011-06-04 209 views
16
var set = [{"color":"blue"},{"color":"green"},{"color":"red"},{"color":"green"}]; 

我希望能够做一些类似db调用的东西,set.find({"color":"green"})并让它返回一个包含该属性的对象的数组。查找对象数组中的匹配对象?

+1

在http://stackoverflow.com/questions/1820593/search-a-javascript-object – 2011-06-04 15:19:16

+0

已经回答了这个例子不会返回整个对象, 可以? – fancy 2011-06-04 15:25:00

+1

这与jQuery无关,因此您应该删除该标记。这纯粹是一个JavaScript问题。 – Domenic 2011-06-04 15:27:34

回答

38

使用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.keysArray#every,所以使用ES5垫片。 (该代码是没有ES5垫片是可行的,但使用手动的循环,并且要少得多写和读的乐趣)

+0

我不介意使用纯ES5,这是在服务器上。 – fancy 2011-06-04 15:27:33

+4

甚至你还包括jQuery标签。 – Domenic 2011-06-04 15:28:50

+0

这将看起来像一种方法? set.find({color:“green”}),基本上是为了创建人造数据库功能。 – fancy 2011-06-04 15:49:15

2

既然你已经包括了jQuery的标签,这里有一个办法做到这一点使用jQuery的map

var results = $.map(set, function(e,i){ 
    if(e.color === 'green') return e; 
}); 

该文档声明您需要返回null以从数组中移除该元素,但显然这是错误的,如注释中的jsFiddle所示;什么都不返回(即返回undefined)也同样适用。

+1

这将返回'[undefined,{color:“green”},undefined,undefined]'。 – Domenic 2011-06-04 15:28:24

+0

@Domenic,http://jsfiddle.net/redler/FXRf8/ – 2011-06-04 15:32:35

+1

@Ken Redler,我认错。对于'$ .map'文档说如果返回'null'它只会删除元素,但我想它承认'undefined'为好。不过,我想通常你会使用'$ .grep'来做到这一点。 – Domenic 2011-06-04 15:36:03

0

我已经使用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 }