在 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个)接下来从一个数组中的另一个元素需要移动到另一个数组时?
请建议。
答案 0 :(得分: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]
splice
的第一个参数是要开始的索引,第二个是要删除的元素数,其余是要插入的元素。因此,如果您插入的号码与删除的号码相同,则最终会替换它们。
如果你确实希望这个来自另一个数组,你可以试试这个,虽然它不是那么干净:
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 suggestion效率低,但它很简单,很可能适用于很多用例。
答案 1 :(得分: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
将值单独添加,而不是作为数组添加。你当然可以用循环编写一个方法,并重用它。
答案 2 :(得分: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()
- for
进行有效迭代时使用in
在稀疏数组上。)
下次首先尝试某事。
答案 3 :(得分:1)
您可以使用push
功能:
myarray.push([123, 432, 233, 98]);
将整个数组添加到数组中或添加单个项目:
myarray.push(123, 432, 233, 98);
要添加到特定位置,您需要使用splice()
功能。
<强>文档:强>
答案 4 :(得分:0)
你应该使用.concat(),如下所示:
myArray = myArray.concat([123, 432, 233, 98])
或者使用.push(),如下所示:
myArray.push(123,432,233,98)
答案 5 :(得分:0)
最新方法:结合使用Spread
这是最新,最简单的方法。
使用...
(传播)运算符以及前面示例中使用的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)