5

JavaScript 中,我以传统方式填充数组元素,例如:

myArray[12] = 123;
myArray[13] = 432;
myArray[14] = 233;
myArray[15] = 98;

是否可以通过一个命令更快地做到这一点?

例如,[123, 432, 233, 98]myArray[12-15]某种方式将数字放入...?不一一。


以及如何优化这种场景:

newArray[12] = oldArray[30];
newArray[13] = oldArray[31];
newArray[14] = oldArray[32];
newArray[15] = oldArray[33];

当一个数组中相邻的 n 个元素(上例中为 4 个)需要移动到另一个数组时?

请指教。

4

6 回答 6

9
var myArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
               12, 13, 14, 15, 16, 17, 18, 19, 20];
myArray.splice(12, 4, 123, 432, 233, 98);

// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
//  123, 432, 233, 98, 16, 17, 18, 19, 20]

第一个参数 tosplice是开始的索引,第二个是要删除的元素的数量,其余的是要插入的元素。因此,如果您插入与删除相同的号码,您最终会替换它们。

如果你确实希望它来自另一个数组,你可以试试这个,虽然它不是那么干净:

var oldArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
               12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
               22, 23, 24, 25, 26, 27, 28, 29, 123, 
               432, 233, 98, 34, 35]
var newArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
               12, 13, 14, 15, 16, 17, 18, 19, 20];

[].splice.apply(newArray, [12, 4].concat(oldArray.slice(30, 30 + 4)));

// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
// 123, 432, 233, 98, 16, 17, 18, 19, 20]

这可能不如PointedEars 建议有效,但它非常简单,可能适用于许多用例。

于 2012-07-06T19:53:33.620 回答
4

最接近的就是splice用来设置输入位置。

第一个参数是开始的索引,第二个参数是要删除的项目数,下一个参数是值....

这是我在控制台中弄乱的一些输出。

myArray = new Array(15)
myArray.splice(12, 4, 123, 432, 223, 98)
myArray.forEach(function(v, i){console.log(v, i)})
123 12
432 13
223 14
98 15
undefined
myArray[12]
123
myArray[13]
432
myArray[14]
223
myArray[15]
98

当然这有几个不足:你不能传递一个你想要插入的值的数组,这个数组需要足够大(即你不能在索引 12 处插入,除非数组至少有 12 长)。

为了将一个数组中一组索引的值传输到另一个数组中的另一组索引,我认为你必须循环。 splice将值单独添加,而不是作为数组。你当然可以用循环编写一个方法,然后重用它。

于 2012-07-06T19:43:06.967 回答
2

Array.prototype.push()并且Array.prototype.splice()是不错的想法,但push()总是附加到数组的末尾(即从length属性指定的索引开始),并且splice()要求您在插入之前删除与插入一样多的元素(这是两倍的成本因为它需要)。

因此,您应该使用循环:

 for (var i = 12; i < 16; ++i)
 {
   _new[i] = old[i + 18];
 }

(new是一个关键字,因此保留;您的示例代码不可执行。我在_new这里使用过它来解决这个问题。)

这可以概括为:

function putValues(array1, array2, start1, start2, num)
{
  if (typeof start1 == "undefined") start1 = 0;
  if (typeof start2 == "undefined") start2 = 0;
  var max = (typeof num == "undefined") ? array2.length : start2 + num;

  for (var i = start1, j = start2; j < max; ++i, ++j)
  {
    array1[i] = array2[j];
  }
}

putValues(newArray, oldArray, 12, 30, 4);

更复杂的概括是可以想象的,例如传递一个或两个索引数组,以便索引不必是连续的。

(抵制将其作为 的方法的诱惑Array.prototype,除非您想在使用-以无序方式在稀疏数组上进行Object.prototype.hasOwnProperty()有效迭代时使用。)forin

下次,先尝试一下

于 2012-07-06T19:58:17.297 回答
2

最新方法:使用Splice和Splice

这是执行此操作的最新和最简单的方法。

使用...(扩展)运算符以及splice前面示例中使用的方法。

这将删除从索引 12 开始的 4 个元素,然后将所需的数组插入位置 12 到 15。

尝试示例代码

const myArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
               12, 13, 14, 15, 16, 17, 18, 19, 20];

console.log('Before:', JSON.stringify(myArray));

myArray.splice(12, 4, ...[123, 432, 233, 98]);

console.log('After: ', JSON.stringify(myArray));

进一步参考:ECMAScript (ECMA-262)

于 2020-05-03T06:27:18.150 回答
1

你可以使用push功能:

myarray.push([123, 432, 233, 98]);

将整个数组添加到您的数组或添加单个项目:

myarray.push(123, 432, 233, 98);

要添加到特定位置,您需要使用splice()函数。

文件:

于 2012-07-06T19:42:09.353 回答
0

您应该使用 .concat(),如下所示:

myArray = myArray.concat([123, 432, 233, 98])

或使用 .push() 如下:

myArray.push(123,432,233,98)
于 2012-07-06T19:43:22.553 回答