在javascript中将数组拼接成数组的更好方法

时间:2009-08-28 16:42:04

标签: javascript arrays

有没有比这更好的方法将数组拼接到javascript中的另一个数组

var string = 'theArray.splice('+start+', '+number+',"'+newItemsArray.join('","')+'");';
eval(string);

8 个答案:

答案 0 :(得分:126)

您可以使用apply来避免使用eval:

var args = [start, number].concat(newItemsArray);
Array.prototype.splice.apply(theArray, args);

apply函数用于调用另一个函数,具有给定的上下文和参数,以数组形式提供,例如:

如果我们致电:

var nums = [1,2,3,4];
Math.min.apply(Math, nums);

apply函数将执行:

Math.min(1,2,3,4);

答案 1 :(得分:43)

更新:ES6版本

如果您在ES6中编码,您可以使用“传播运营商”(...)

array.splice(index, 0, ...arrayToInsert);

要了解有关点差运算符的详情,请参阅mozilla documentation

'旧'ES5方式

如果你将最常见的答案包装成一个函数,你会得到这个:

function insertArrayAt(array, index, arrayToInsert) {
    Array.prototype.splice.apply(array, [index, 0].concat(arrayToInsert));
}

您可以这样使用它:

var arr = ["A", "B", "C"];
insertArrayAt(arr, 1, ["x", "y", "z"]);
alert(JSON.stringify(arr)); // output: A, x, y, z, B, C

你可以在这个jsFiddle:http://jsfiddle.net/luisperezphd/Wc8aS/

中查看

答案 2 :(得分:7)

这个问题真的很老了,但是对于ES6,使用扩展运算符的方法更简单:

df_coefficients = pd.DataFrame(data = log_model.coef_.T, index = X.columns,
                               columns = ['Coefficients'])

如果您在浏览器中使用未经编译的javascript,请务必检查目标浏览器是否支持https://kangax.github.io/compat-table/es6/#test-spread_(...)_operator

此外,这可能稍微偏离主题,但如果您不想或不需要修改原始数组,但可以使用新数组,请考虑以下方法:

sourceArray.splice(index, 0, ...insertedArray)

答案 3 :(得分:6)

如果你想要一些与splice方法几乎相同的东西,你也可以将这样的函数添加到Array原型中。 E.g。

Array.prototype.spliceArray = function(index, n, array) {
    return Array.prototype.splice.apply(this, [index, n].concat(array));
}

然后使用就是:

var array = ["A","B","C","","E","F"];

array.splice(3,1,"D");
// array is ["A","B","C","D","E","F"]

array.spliceArray(3,3,["1","2","3"]);
// array is ["A","B","C","1","2","3"]

在此处查看此行动:http://jsfiddle.net/TheMadDeveloper/knv2f8bb/1/

一些注意事项:

  • splice函数直接修改数组,但返回已删除的元素数组...而不是拼接数组。
  • 虽然通常不建议扩展核心javascript类,但这对大多数标准框架来说都是相对良性的。
  • 扩展Array在使用专门的数组类的情况下不会工作,例如ImageData数据Uint8ClampedArray。

答案 4 :(得分:1)

上面的答案涉及splice.apply并将数组插入一个衬里将在堆栈溢出中炸毁堆栈以获得大数组。 见这里的例子: http://jsfiddle.net/gkohen/u49ku99q/ 您可能必须切片并推送原始数组的插入和剩余部分的每个项目才能工作。 请参阅小提琴:http://jsfiddle.net/gkohen/g9abppgy/26/

Array.prototype.spliceArray = function(index, insertedArray) {
   var postArray = this.splice(index);
   inPlacePush(this, insertedArray);
   inPlacePush(this, postArray);

   function inPlacePush(targetArray, pushedArray) {
// Not using forEach for browser compatability
       var pushedArrayLength = pushedArray.length;
       for (var index = 0; index < pushedArrayLength; index++) {
           targetArray.push(pushedArray[index]);
       }
   }
}

答案 5 :(得分:0)

这里有很多聪明的答案,但你使用拼接的原因是它将元素放入当前数组而不创建另一个。如果你必须创建一个数组到<?php $source = [0 => 'bla', 1 => 'blop']; // Get your keys $keys = array_keys($source); // Prepend whatever to each key $formatted_keys = array_map(function ($key) { return 'A' . $key; }, $keys); // Build a new array using $formatted_keys for keys // and array_values($source) for values. $result = array_combine($formatted_keys, array_values($source)); http://php.net/manual/en/function.array-keys.php http://php.net/manual/en/function.array-values.php http://php.net/manual/en/function.array-combine.php ,那么你可以使用concat(),然后你创建了2个额外的垃圾数组! Sorta打败了写作深奥的Javascript的整个目的。此外,如果你不关心那些内存使用的东西(你应该)只是apply();它更具可读性。所以这是我最小的线数,同时保持高效的答案。

dest = src1.concat(src2)

或者,如果您想要填充它并获得更好的浏览器支持:

for( let item of src ) dest.push( item );

我确信第一个更高性能(这是一个词;),但在野外的所有浏览器中都不支持。

答案 6 :(得分:0)

如果您不想将插入项连接到Array.splice()的前两个参数, 一种优雅的方法是一起使用Function.bind()Function.apply()

theArray.splice.bind(null, startIndex, deleteCount).apply(newItemsArray);

答案 7 :(得分:-1)

我想要一个只占用源数组部分的函数,所以我的略有不同 基于CMS's answer

function spliceArray(array, index, howmany, source, start, end) {
    var arguments;
  if( source !== undefined ){
    arguments = source.slice(start, end);
    arguments.splice(0,0, index, howmany);
  } else{
   arguments = [index, howmany];
  }
    return Array.prototype.splice.apply(array, arguments)
}

Array.prototype.spliceArray = function(index, howmany, source, start, end) {
    return spliceArray(this, index, howmany, source, start, end);
}

您可以在https://jsfiddle.net/matthewvukomanovic/nx858uz5/

看到它