【问题标题】:Return all matching elements of an array of objects?返回对象数组的所有匹配元素?
【发布时间】:2014-11-10 12:50:51
【问题描述】:

我有一个由具有两个属性的对象组成的数组。

一个属性“值”是 1 到 6 之间的数字。 另一个属性“id”是一个介于 1 和 200 之间的数字。

如何返回“value”= 1 的所有对象的“id”属性并将它们写入新数组?

【问题讨论】:

  • 您好,只是想知道您卡在哪里了吗?你知道如何循环数组吗?你知道如何从对象中获取属性吗?你知道如何使用if 语句来比较值,并以此为基础做不同的事情吗?你知道如何创建一个新数组并向其中添加东西吗?
  • 嗯,我只是在寻找一个代码最少的想法。我想在整个代码中保留我的“大/原始”数组,并且正在寻找一种轻松访问 id 属性的方法。
  • 不,我不是想问为什么你这样做。当然,提取一组 ID 并保留它可能是个好主意。我在问,你在哪里卡住了,不知道该怎么做。我只是好奇,因为这涉及绝对基本的、基本的、基本的、基本的 JS 构造,即遍历数组以获取每个对象,然后获取其属性值,然后比较它,然后将其粘贴到数组中。还能有什么其他想法?既然你根本没有编写任何代码,为什么还要关心“最少”代码?

标签: javascript


【解决方案1】:

您应该在那里调用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 );

【讨论】:

  • 当然这是正确的解决方案,但我只是想知道在似乎被卡在某个地方的人身上抛出带函数的函数是否是个好主意,更不用说 ES6 箭头函数了在循环、对象属性引用、if 语句和数组创建之间。顺便说一句,您遗漏了很酷的数组理解版本。 :-)
  • @torazaburo 在我看来,提供方便和简单的解决方案总是一个好主意。
  • 我发布了理解版本,只要我们正在进入 ES6 领域。至于现实世界的解决方案,在这种情况下,我有点像@MichaelFreund 的老派方法(假设他修复了for...in 循环)。
【解决方案2】:

纯 JS.... 没有过滤器/映射功能,IE 不可用

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:实际上,for...in不会迭代长度。 “长度”不是可枚举的属性。
  • @torazaburo 正如作者在这里明确提到的,它适用于
  • 我不明白你的评论。 for...in 不会在自诞生以来构建的任何浏览器中迭代长度。它始终是不可枚举的,甚至可以追溯到当可枚举性严格是引擎内部的概念时。
  • 如果您确实想过滤掉这些,只需在循环中执行此操作if (array.hasOwnProperty(key) && array[key].value == 1)
【解决方案3】:

您可以使用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;
}); 

【讨论】:

    【解决方案4】:

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

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

    坏消息是,您需要一段时间才能依赖所有浏览器来执行此操作。它来自名为“ES6”的新版本语言。但是你现在可以在 Firefox 中尝试一下!!

    【讨论】:

    • 哎呀!数组推导在 ES6 中被删除,并且似乎没有计划将它们包含在接下来的事情中。正如这里所说的(developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…):“不要使用”!它似乎适用于FF,但不适用于其他浏览器。我不清楚可以使用什么构造来代替(除了一个完全不性感的循环):mapfilter...?
    猜你喜欢
    • 2013-02-19
    • 2012-10-25
    • 1970-01-01
    • 2019-02-18
    • 2022-01-21
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    相关资源
    最近更新 更多