开发者问题收集

这种方法中数组拼接不起作用,是什么问题?

2020-09-14
360

我试图在以下位置插入新项目。问题是 concat() 工作正常,但当我使用切片或拼接时却不行。甚至没有显示任何错误,只是显示空白屏幕。

 getItems() {
      const item2 = {
        name: '...',
        description: '...',
        id: '...',
      }
      let items = { ...this.items }
      
        return Object.keys(items)
          .map(id => ({
            ...items[id],
            id,
          }))
          .splice(2, 0, item2)
      ...
}

它看起来是这样的。为什么 concat 工作正常,但切片或拼接不行?如果这些方法不起作用,我该如何通过其他方式将该项目推到我想要的位置?

1个回答

假设我正确理解了您要执行的操作,您有两个选择:

  1. getItems 中,创建一个新数组,修改新数组以插入值,返回新数组。
  2. getItems 中,在一行中声明一个新数组并返回该数组。

选项 1 的示例:

getItems() {
  const item2 = {
    name: '...',
    description: '...',
    id: '...',
  }

  let items = { ...this.items }
      
  const resultArray = Object.keys(items)
    .map(id => ({
      ...items[id],
      id,
    }))

  resultArray.splice(2, 0, item2) // This does **not** return the right value, it only modifies resultArray to become the value you want.
  return resultArray // Instead we return resultArray on a new line.
}

选项 2 的示例:

getItems() {
  const item2 = {
    name: '...',
    description: '...',
    id: '...',
  }

  let items = { ...this.items }
      
  const resultArray = Object.keys(items)
    .map(id => ({
      ...items[id],
      id,
    }))

  return [ ...resultArray.slice(0, 2), item2, ...resultArray.slice(2) ]
}

回答您关于为什么 concat() 有效但 slice()splice() 无效的问题: concat() 返回添加了元素的新数组。 slice() 不能用于创建添加了项目的数组。 splice() 同时执行两件不同的事情:它修改一个数组以删除或插入项目, 并且 它返回一个仅包含被删除内容的新数组。

第二个示例与使用 concat() 解决问题非常相似:它相当于 return [].concat(resultArray.slice(0, 2), [item2], resultArray.slice(2))

Mattias Martens
2020-09-14