使用嵌套在 .map 中的 .find 构建对象数组
Posted
技术标签:
【中文标题】使用嵌套在 .map 中的 .find 构建对象数组【英文标题】:Use .find nested in .map to build array of objects 【发布时间】:2018-09-13 08:47:39 【问题描述】:我有 2 个数组。
1) 一个 ID 数组。前任。 item_ids: [1, 4, 12]
2) 对象数组
例如。
items: [
0: id: 1...,
1: id: 5...,
2: id: 12...
]
我需要构建一个新数组,其中包含来自第二个数组 items
的对象,其 ID 在第一个数组中。
在这种情况下,它将是一个由对象 1 和 3 组成的数组,因为它们的 ID 存在于第一个数组中
这是我目前正在尝试的,但它为所有三个对象返回 undefined
(在我使用它的示例中有 3 个)
let new_avails = avails.avails_to_update.map(id =>
this.state.availabilities.availabilities.find(function(a)
return a.id == id
)
, this)
avails_to_update
== 身份证
this.state.availabilities.availabilities
== 对象数组
【问题讨论】:
filter
标签表明你知道你需要使用过滤器。您是否尝试过任何我们可以帮助您调试的方法?
【参考方案1】:
由于the nature of Sets
:以下解决方案比在Array.prototype.filter()
中嵌套Array.prototype.includes()
少time complex
。
请参阅和Set.has()
了解更多信息。
// Input.
const items = [id: 1,id: 5,id: 12]
const ids = [1, 4, 12]
// Filter.
const filter = (x, y) =>
const s = new Set(y)
return x.filter((id) => s.has(id))
// Output.
const output = filter(items, ids)
// Proof.
console.log(output)
【讨论】:
【参考方案2】:函数map
将创建一个与原始数组长度相同的新数组。
使用函数filter
和函数includes
来完成您的要求。
var item_ids= [1, 4, 12],
items= [id: 1,id: 5,id: 12],
filtered = items.filter(item => (item_ids.includes(item.id)));
console.log(filtered)
.as-console-wrapper max-height: 100% !important; top: 0;
【讨论】:
.includes
的爱在哪里?使用.some
似乎有点矫枉过正。以上是关于使用嵌套在 .map 中的 .find 构建对象数组的主要内容,如果未能解决你的问题,请参考以下文章
在javascript中使用Object.keys()和map()方法访问对象数组
Groovymap 集合 ( map 集合遍历 | 使用 map 集合的 find 方法遍历 map 集合 | 代码示例 )