使用.find嵌套在.map中构建对象数组

时间:2018-04-03 22:28:23

标签: javascript arrays filter array.prototype.map

我有2个阵列。

1)一系列ID。恩。 item_ids: [1, 4, 12]

2)一个对象数组

离。

items: [
  0: {id: 1...},
  1: {id: 5...},
  2: {id: 12...}
]

我需要构建一个NEW数组,该数组由第二个数组items中的对象组成,其ID在第一个数组中找到。

在这种情况下,它将是一个由对象1和1组成的数组。因为他们的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 == id' s

this.state.availabilities.availabilities ==对象数组

2 个答案:

答案 0 :(得分:3)

函数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; }

答案 1 :(得分:0)

由于the nature of Sets:以下解决方案比在time complex内嵌套Array.prototype.includes()Array.prototype.filter()

有关详情,请参阅和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)