在ES5 Javascript中,如何在不使用concat的情况下将项添加到数组并立即返回新数组?

时间:2016-06-03 13:40:49

标签: javascript arrays lodash ecmascript-5

我经常发现自己处于我想要的情况,在单个(原子)操作中,将一个项添加到数组并返回该新数组。

var

将无效,因为它返回新的长度。

我知道以下代码可以使用

['a', 'b'].push('c');

但我发现它很丑陋的代码(将两个数组组合起来只是为了在第一个数组的末尾添加一个项目)。

我无法使用['a', 'b'].concat(['c']); ,因为它会修改原始数组(并返回已删除的项目)。 Array.splice()会返回浅层副本,但您无法添加新项目。

ES6

我知道在Array.slice()你可以使用

es6

但我正在寻找[...['a', 'b'], 'c'] 解决方案

Lodash

我可以使用es5

要清楚

我知道这可以通过几种不同的方式实现(比如上面的lodash方法),但我正在寻找一个直观的简单代码,它不会“误用”其他运算符

2 个答案:

答案 0 :(得分:5)

  

我知道以下代码有效['a', 'b'].concat(['c']);但我发现了   它丑陋的代码(组合两个数组只是为了添加一个项目   第一个数组的结尾)。

concat()方法可以给出单个(或多个)值,而不需要先在数组中封装值,例如:

['a', 'b'].concat('c');   // instead of .concat(['c']);

来自MDN(我的重点):

  

数组和/或以连接成新数组。

除此之外,没有使用扩展和现有方法的选项有限。

关于如何扩展Array的示例(这将返回当前数组):

Array.prototype.append = function(item) {
  this.push(item);
  return this
};

var a = [1, 2, 3];
console.log(a.append(4))

可选择创建一个简单的函数,如@torazaburo所建议的,它可以将数组和项作为参数:

function append(arr, item) {
  arr.push(item);
  return arr;
}

或使用concat()

function append(arr, item) {
  return arr.concat(item)
}

答案 1 :(得分:0)

我可以为Array.prototype.insert()提供两种方法,允许您从数组中的任何索引开始插入单个或多个元素。

1)改变它所调用的数组并返回它



Array.prototype.insert = function(i,...rest){
  this.splice(i,0,...rest)
  return this
}

var a = [3,4,8,9];
console.log(JSON.stringify(a.insert(2,5,6,7)));




上述代码段的ES5兼容版本。

Array.prototype.insert = function(i){
  this.splice.apply(this,[i,0].concat(Array.prototype.slice.call(arguments,1)));
  return this;
};

2)不会改变它所调用的数组并返回一个新数组



Array.prototype.insert = function(i,...rest){
  return this.slice(0,i).concat(rest,this.slice(i));
}

var a = [3,4,8,9],
    b = a.insert(2,5,6,7);
console.log(JSON.stringify(a));
console.log(JSON.stringify(b));




上述代码段的ES5兼容版本。

Array.prototype.insert = function(i){
  return this.slice(0,i).concat(Array.prototype.slice.call(arguments,1),this.slice(i));
}