【问题标题】:"push()" method returns the length of array instead of array (JavaScript)“push()”方法返回数组的长度而不是数组(JavaScript)
【发布时间】:2017-05-02 12:19:16
【问题描述】:

我想通过 "push()" 方法向现有数组添加一个元素来制作一个新数组

这是现有数组

let arr = [{label: 1, value: 1}, {label: 2, value: 2}];

这是我要添加到现有数组的元素:

{label: 3, value: 3}

这是带有 "push()" 方法的完整代码:

let arr = [{label: 1, value: 1}, {label: 2, value: 2}];

let newArr = arr.push({label: 3, value: 3});

console.log(newArr); // 3

但是push()方法返回新数组的长度,即"3""newArr"强>变量。但是,我真正想要的是 实际的新数组,而不是 "newArr" 变量的 其长度

有没有办法为 "newArr" 变量获取实际的新数组

【问题讨论】:

  • 实际数组还是arrpush 改变你调用它的原始数组。
  • 您需要查看arr。它只是被推到它上面。 push 返回插入后的长度
  • array.push 根据文档,返回添加项目后的长度

标签: javascript arrays json object array-push


【解决方案1】:

使用 push 你实际上是在改变原始数组。不可变数组扩展仅在 ES2015+ 中可用(当前所有主流浏览器都支持)。您可以使用扩展运算符...

const original = [1, 2];
const next = [...original, 3];
console.log(next); // [1, 2, 3]

另外new 是保留关键字,不能用作标识符。

【讨论】:

    【解决方案2】:

    首先new关键字在javascript中有指定的作用,不能作为变量名使用。

    Reserved keywords in javascript.

    其次,push 方法在原地工作,您不必将其分配给新变量。它不会返回一个新的数组,而是修改原来的数组。

    var arr = [{label: 1, value: 1}, {label:2, value:2}];
        arr.push({label:3, value:3});
        
        console.log(arr);

    【讨论】:

      【解决方案3】:

      用户7334203, 你写的 arr.push({label:3, value:3}) 意味着你的新对象推送到你的数组中,所以只需打印你的数组就可以得到你的数组。

      var a = [{label: 1, value: 1}, {label:2, value:2}],
      a.push({label:3, value:3}),
      var new = a; 
      console.log(new)
      

      【讨论】:

        【解决方案4】:

        不要使用const 。只需使用arr#push 。它足以添加数组

        var arr= [{label: 1, value: 1}, {label:2, value:2}] 
        arr.push({label:3, value:3}) 
         console.log(arr)

        【讨论】:

          【解决方案5】:

          学习 JS 的一个很好的参考是 MDN。如果您查看the Array#push spec,您会发现它会改变输入数组,并返回数组的新长度。

          【讨论】:

            【解决方案6】:

            来自 MDN documentation push 返回数组的新长度,既不是新数组,也不是附加值。

            push 函数在原地更改数组,这意味着它将更改原始数组(您实际上不需要重新分配它)!

            您可以通过将代码更改为: arr.push({label:3, value:3});

            然后分配给一个新数组,例如: const newArr = arr;

            【讨论】:

            • 请注意,newArrarr 指向同一个数组对象,因此修改 newArr(例如通过 pushing)也会修改 arr。有关非变异解决方案,请参阅@OleBläsing 答案。
            • 确实如此。一个解决方案可能是使用const newArr = arr.slice();,但我尽量避免进入更多细节,现在尽可能简单地回答。不过,这确实是我的错误,感谢您指出这一点;)
            【解决方案7】:

            您可以使用 "concat()" 方法获取 "newArr" 变量的实际新数组,如下所示:

            let arr = [{label: 1, value: 1}, {label: 2, value: 2}];
            
            let newArr = arr.concat({label: 3, value: 3});
            
            console.log(newArr); 
            // [
            //   {label: 1, value: 1}, 
            //   {label: 2, value: 2}, 
            //   {label: 3, value: 3}
            // ]

            此代码不需要 "newArr" 变量。 实际的新数组分配给原始变量“arr”

            let arr = [{label: 1, value: 1}, {label: 2, value: 2}];
            
            arr = arr.concat({label: 3, value: 3});
            
            console.log(arr);
            // [
            //   {label: 1, value: 1},
            //   {label: 2, value: 2},
            //   {label: 3, value: 3}
            // ]

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-12-20
              • 1970-01-01
              • 2014-06-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-12-15
              • 2013-11-20
              相关资源
              最近更新 更多