【问题标题】:Pushing spliced items returns nested array推送拼接项返回嵌套数组
【发布时间】:2020-12-16 16:44:37
【问题描述】:

我正在尝试将 3 个随机项从一个数组推送到一个新数组中。我使用splice() 抓取一个项目并将其从旧数组中删除。当我 push() 这些项目时,我想将它们重新放在一个数组中。

例如:

["b", "f", "a"]

这是我的代码:

const letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
let newletters = [];

for (let i = 0; i < 3; i++) {
    newletters.push(letters.splice(Math.floor(Math.random() * letters.length), 1));
}

console.log(newletters);

好像我将拼接的项目作为数组推送到新数组中,有没有办法解决这个问题?

[
  [
    "b"
  ],
  [
    "f"
  ],
  [
    "a"
  ]
]

【问题讨论】:

  • Array#splice 总是返回一个包含已删除项目的数组

标签: javascript arrays push splice


【解决方案1】:

你可以从spread ... 得到Array#splice 的数组。

或者用和索引取第一个元素。

letters.splice(Math.floor(Math.random() * letters.length)[0]

const letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
let newletters = [];

for (let i = 0; i < 3; i++) {
    newletters.push(...letters.splice(Math.floor(Math.random() * letters.length), 1));
}

console.log(newletters);

【讨论】:

    【解决方案2】:

    您可以改用函数Array.prototype.concat

    const letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
    let newletters = [];
    
    for (let i = 0; i < 3; i++) {
        newletters = newletters.concat(letters.splice(Math.floor(Math.random() * letters.length), 1));
    }
    
    console.log(newletters);

    【讨论】:

      【解决方案3】:

      在 push 语句中使用 ... 运算符。

      const letters = ['a', 'b', 'c', 'd', 'e'];
      const newLetters = []
      newLetters.push(...letters.splice(1, 2)) // Equal to newLetters.push('b', 'c')
      console.log(newletters)
      

      【讨论】:

        【解决方案4】:

        const letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
        let newletters = [];
        
        for (let i = 0; i < 3; i++) {
            newletters.push(letters.splice(Math.floor(Math.random() * letters.length), 1));
        }
        
        console.log(newletters.flat());

        【讨论】:

        • 您能解释一下这如何回答手头的问题吗?
        • @MZ 我在那里只添加了一个函数 - flat() Аnd 你可以用谷歌搜索它是什么并找到更好的解释
        • 带有解释的答案,而不仅仅是一个链接,在 SO 上做得更好
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-10
        • 1970-01-01
        • 1970-01-01
        • 2017-06-11
        • 1970-01-01
        • 1970-01-01
        • 2016-09-29
        相关资源
        最近更新 更多