返回对象数组中所有匹配的元素?

29
我有一个由包含两个属性的对象组成的数组。
一个属性“value”是1到6之间的数字。 另一个属性“id”是1到200之间的数字。
如何返回所有“value”等于1的对象的“id”属性,并将它们写入一个新数组?

嗨,只是想知道你卡在哪里了?你知道如何循环遍历数组吗?你知道如何从对象中获取属性吗?你知道如何使用“if”语句比较值,并根据结果执行不同的操作吗?你知道如何创建一个新的数组,并向其中添加元素吗? - user663031
嗯,我只是在寻找一种代码最少的想法。我想在整个代码中保留我的“大/原始”数组,并寻找一种轻松访问id属性的方法。 - Moritz Schmitz v. Hülst
不,我并不是想问你为什么要这样做。当然,提取出一个ID数组并将其保留下来可能是个好主意。我想问的是,你在想如何实现它时遇到了什么问题。我只是很好奇,因为这涉及到绝对基础、基本、初步、基础的JS构造,即循环遍历数组以获取每个对象,然后获取其属性值,再进行比较,最后将其放入数组中。还有哪些其他的想法?而且你为什么在这个时候关心"少"代码,当你还没有写任何代码呢? - user663031
5个回答

50

你应该在那里调用 Array.prototype.filter 函数。

var filteredArray = YourArray.filter(function( obj ) {
    return obj.value === 1;
});

.filter()要求您返回所需的条件。它将创建一个新的数组,基于过滤后的结果。如果您想进一步操作该已过滤的 Array,可以调用更多方法,就像在您的实例中使用的 .map() 方法一样。

var filteredArray = YourArray.filter(function( obj ) {
    return obj.value === 1;
}).map(function( obj ) {
    return obj.id;
});

console.log( filteredArrays ); // a list of ids

... 在不久的将来,我们最终可以使用 ES6 的 箭头函数,使得这段代码更加美观:

var filteredArray = YourArray.filter( obj => obj.value === 1 ).map( obj => obj.id );

当然,这是正确的解决方案,但我只是在想是否向某个似乎在循环、对象属性引用、if语句和数组创建之间卡住的人抛出接受函数的函数,更不用说ES6箭头函数了,是否是一个好主意。顺便说一下,你忘记了酷炫的数组推导式版本。 :-) - user663031
@torazaburo 在我看来,提供方便简单的解决方案总是一个好主意。 - jAndy
我发布了理解版,只要我们越过ES6领域。至于真实世界的解决方案,在这种情况下,我有点喜欢@MichaelFreund的老派方法(假设他修复了for...in循环)。 - user663031

4

纯JS代码...没有filter/map函数,因为IE < 9不支持。

var array = [
        {id:10, value:2}, {id:11, value:1}, {id:12, value:3}, {id:13, value:1}
    ],
    result = [];
for(key in array) { if (array[key].value == 1) result.push(array[key].id); }

是的,但如果你使用for..in循环遍历Array,它也会包括像.length和其他属性一样的垃圾。 - jAndy
@jAndy:实际上,for...in不会遍历长度。'length'不是一个可枚举的属性。 - user663031
正如作者在这里明确提到的那样,@torazaburo是为像< IE9这样的浏览器设计的。这些浏览器对属性描述符一无所知。 - jAndy
1
我不理解你的评论。自从互联网诞生以来,任何一个浏览器内置的for...in都不会迭代长度。即使在枚举是引擎内部严格概念的早期,它也始终是不可枚举的。 - user663031
如果你一定要过滤掉它们,只需在循环中这样做:if (array.hasOwnProperty(key) && array[key].value == 1) - Michael Freund

0

如果要从一个数组中搜索多个项目并将其放入某些对象数组中,请使用以下方法

let old = []
ao = [{}, {}], array of objects
let newlist = []
old.map(a => ao.find(x => x.Name == a)!==undefined? newlist.push(ao.find(x => x.Name == a)): null)

0
你可以使用 Array.prototype.filterArray.prototype.map 的组合。
首先,过滤只有 value 等于 1 的值。
arr.filter(function (obj) {
    return obj.value === 1;
});

然后,您将现有的集合映射到一个新数组中,该数组仅包含存储在过滤数组中的id属性。因此,最终的代码如下:
var newArr = arr.filter(function (obj) {
    return obj.value === 1;
}).map(function (obj) {
    return obj.id;
}); 

0

好消息是,这很容易,只需要写

[ for (obj of array) if (obj.value === 1) obj.id ]

坏消息是,在所有浏览器都能够支持这个功能之前,还需要一些时间。这是来自一种名为“ES6”的新语言版本。但是你现在可以在Firefox中尝试它!


1
哎呀!ES6中删除了数组推导,并且似乎没有计划在下一个版本中包含它们。正如这里所说(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Array_comprehensions):“不要使用”!它似乎在FF上运行,但其他浏览器不行。我不清楚可以使用哪些构造(除了一种毫不性感的迭代循环):`map`,`filter`...? - mike rodent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接