在javascript中,可以说我有n
个项目的预分配数组,并且我还有另一个数组要在给定的起始索引处复制到第一个数组中,以下是一种实现方法:
let arr = new Array(25);
console.log(arr);
let arrB = Array(5).fill(1);
let insertAt = 5;
for(let ix = 0; ix < arrB.length; ix++)
arr[ix + insertAt] = arrB[ix];
console.log(arr);
是否有更有效/标准的方法?
我正在考虑与C ++中的内容等效的内容: http://www.cplusplus.com/forum/general/199358/
答案 0 :(得分:1)
出于效率考虑,我认为没有比您发布的代码更好的方法了。您将需要遍历数组中所有需要复制的项目。
我同意其他观点,因为使用slice
可能是这样做的标准方法。
答案 1 :(得分:1)
不确定该代码的性能如何(仍然是一名学习者),但提出了将其作为实现这种结果的另一种方法。
let arr = new Array(25);
let arrB = Array(5).fill(1);
let insertAt = 5;
function copy(index) {
if (arrB.length === 0 || index > 9) {
return;
}
arr[index] = arrB.shift();
copy(index + 1);
}
copy(insertAt);
答案 2 :(得分:0)
我最终制作了一个模块来简化此操作:
const checks = require("checks"); //NB, NOT ON NPM....
(()=>{
Array.prototype.copyInto = function(arr,ix = 0){
if(!checks.isArray(arr))
throw new Error("'arr' argument must be an array");
if(!checks.isInteger(ix) || ix < 0)
throw new Error("'ix' must be a positive integer");
for(let i = 0; i < arr.length; i++)
this[ix+i] = arr[i];
return this;
}
})();
这意味着它可以像这样使用:
let x = Array(5).fill(0).copyInto([1,1],2);
console.log(x);
不确定这是否正确,但这对我有用。
答案 3 :(得分:-1)
尝试
arr.splice(insertAt,5, ...arrB)
let arr = new Array(25);
console.log(arr);
let arrB = Array(5).fill(1);
let insertAt = 5;
arr.splice(insertAt,5, ...arrB)
console.log(arr);
后跟MDN documentation splice()方法通过删除或替换现有元素和/或添加新元素来更改数组的内容。语法:arr.splice(start[, deleteCount[, item1[, item2[, ...]]]])
。上面片段中的示例用法
更新
独立的拼接是标准方式,但是比for循环慢-我执行测试来检查它HERE。拼接比for循环慢约28%。
如果您的数组包含浮点数,则可以使用Float32Array或Uint32array,其速度几乎是Array
的2倍(Chrome不支持拼接)
let arr = new Float32Array(25);
console.log(arr);
let arrB = new Float32Array(5).fill(1);
let insertAt = 5;
for(let ix = 0; ix < arrB.length; ix++)
arr[ix + insertAt] = arrB[ix];
console.log(arr);
更新2
我读了answer,并与Uint32Array
进行了比较(如果您希望使用带整数的数组)-它比普通数组-here快2倍。
Uint32Array.prototype.copyInto = function(arr,ix = 0) {
for(let i = 0; i < arr.length; i++)
this[ix+i] = arr[i];
return this;
}
let a = new Uint32Array(2).fill(1);
let x = new Uint32Array(5).fill(0).copyInto(a,2);
console.log(x);