在对象数组中查找匹配的对象?

IT技术 javascript
2021-01-23 10:57:31
var set = [{"color":"blue"},{"color":"green"},{"color":"red"},{"color":"green"}];

我希望能够执行诸如 db 调用之类的操作,set.find({"color":"green"})并让它返回一个充满包含该属性的对象的数组。

4个回答

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

它可能只是在用户对象上,因此 findUser() 在用户数组中找到他们的对象 - 不需要是通用方法。
2021-03-17 10:57:31
@float,您是想将此方法添加到所有数组,还是只是您的自定义对象,或者...?如果是前者,您希望它对整数数组做什么?
2021-03-23 10:57:31
更奇怪的是,您还包含了 jQuery 标记。
2021-03-24 10:57:31
好吧,欢迎您发布有关方法在 JavaScript 中如何工作的后续问题,但只是为了让您入门, var users = { users: [], findUser: function (properties) { return findByMatchingProperties(this.users, properties); } };
2021-03-26 10:57:31
作为一种方法,这会是什么样子?set.find({color:"green"}),基本上是为了创建人造数据库功能。
2021-04-12 10:57:31

我使用了 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 的地图功能正是我所需要的。您的代码片段很棒,并且是第一个建议使用 map 的代码片段,因此我对您的代码片段投了赞成票。
2021-03-28 10:57:31

由于您已经包含了 jQuery 标记,这里是使用 jQuery 的一种方法map

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

文档指出您需要返回null以从数组中删除元素,但显然这是错误的,如注释中的 jsFiddle 所示;不返回任何内容(即返回undefined)也同样有效。

@Domenic,我确实null在文档中看到了这一点,但据我所知,它总是与undefined在某些情况下没有返回的函数一起使用也就是说,如果我没记错的话,完全省略 return 语句总是会导致一个元素为零的数组。
2021-03-24 10:57:31
这将返回[undefined, { color: "green" }, undefined, undefined]
2021-03-29 10:57:31
@Ken Redler,是的,我相信你;我只是认为他们的文档没有提到这一点很糟糕。
2021-04-04 10:57:31
@Domenic,我同意。我已向 jQuery 团队提交了文档更新建议。
2021-04-10 10:57:31
@Ken Redler,我已经纠正了。的文档$.map说它只会在您返回时删除该元素null,但我想它也能识别undefined不过,我认为通常你会想要使用$.grep它。
2021-04-11 10:57:31

使用带有隐含return和简洁主体的箭头函数

const results = set.filter(entry => entry.color === "green");

另一个传入搜索变量的示例:

const searchString = 'green'; 
const results = set.filter(entry => entry.color === `${searchString}`);

MDN上阅读有关箭头函数的更多信息