javascript - 重构 forEach 循环最有效的功能方式是什么?

标签 javascript ecmascript-6 ecmascript-2016

我有一个方法可以接受 Prop 中的元素和可用元素。在数组上迭代时,我应该按 forEach 循环内的两个条件过滤项目。如果项目 id 不存在或项目 id 等于 1,第一个条件将传递项目。第二个条件应返回项目并过滤“描述”字段,否则,我们将项目推送到“nextAvailableItems”数组中。在这种情况下替换 forEach 循环的最有效的功能方法是什么?

项目结构:

[{
  id: 23740416,
  display_name: "test",
  date_from: "1970-12-31"
}]

可用项目结构:

[{
  id: 23740416,
  display_name: "test",
  description: "Text"
}]

预期输出:

[{
  id: 23740416,
  display_name: "test"
}]

当前代码:

buildAvailableItems() {
  const { items, availableItems } = this.props
  const nextAvailableItems = [...availableItems]

  items.forEach(item => {
    if (!item.id || item.id === -1) {
      return
    }

    const availableItem = availableItems.find(availableItem => availableItem.id === item.id)

    if (availableItem) {
      const { id, display_name } = availableItem

      return { id, display_name }
    }
    const { id, display_name } = item

    nextAvailableItems.push({ id, display_name })
  })

  return nextAvailableItems
}

最佳答案

buildAvailableItems() {
  const { items, availableItems } = this.props

  const itemIds = items.reduce((c, i) => (c[i.id] = true, c), {})

  const nextAvailableItems = availableItems
    .filter(a => itemIds[a.id])
    .map(a => ({ id: a.id, display_name: a.display_name }))

  return [...availableItems, ...nextAvailableItems]
}

首先,我会将 items 转换为 ID 查找。然后使用该查找过滤您的 availableItems。然后最后进行数组合并。

关于javascript - 重构 forEach 循环最有效的功能方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58098459/

相关文章:

javascript - HTML - 如何只加载过滤后的图像?

javascript - Node.js - 将数据缓冲到 Ffmpeg

reactjs - 为什么 typescript 允许我覆盖空状态对象?

javascript - 全局更改默认超时或仅更改一次测试的最佳做法是什么? Mocha

javascript - JavaScript 函数是否调用 LeftHandSideExpression,从而调用 ExpressionStatement?

javascript - 如何根据附加参数刷新剑道网格

javascript - Jquery如果$this属性选择器包含一个词

javascript - “ShouldWorkController”不是函数。未定义

javascript - React 组件 - 去抖

javascript - 为什么在 `IdentifierName` 的产生式中递归使用 `IdentifierName` 符号