请你帮我解决这个算法而不使用拼接:
编写一个在索引B处插入新数字A的程序。例如,如果array = [1,3,5,7]且A = 10且B = 2,则在程序结束时,数组应该是[1,3,10,5,7]。
我的想法是我会循环遍历数组,然后将A替换为B,但它不太正确:
for(var i = 0; i < arr.length; i++) {
arr[2] = 10;
}
答案 0 :(得分:2)
不使用.splice
,您仍有很多选择。现在让我们看一个简单的例子。
此解决方案涉及使用反向循环,并手动调整索引以插入单个值。这会改变原始数组。
你可以在这里看到我们只是将我们的下一个值移动到当前位置,该位置从等于我们长度的索引开始。然后我们可以在最终索引中插入新值。
function insert (array, index, value) {
var i = array.length;
while (i > index) {
array[i] = array[--i]; // Prefix is important.
}
array[i] = value; // Or array[index], i === index at this point.
return array;
}
console.log(insert([1,2,3,4], 2, 'B'));
&#13;
这只会将一个元素插入到数组中。你能弄清楚如何从index
开始插入多个元素吗?
如果您被允许使用.slice
和.concat
,则可以模拟插入.splice
。这将返回一个新数组。
function insert (array, index, value) {
return array.slice(0, index).concat(value, array.slice(index));
}
console.log(insert([1,2,3,4], 2, 'B'));
&#13;
答案 1 :(得分:1)
由于插入会影响数组的长度,因此一种方法是将元素从末尾移动到当前位置+ 1,然后在达到所需索引时插入新元素。
使用递减循环:
function slowSplice(array, element, index) {
for (var i=array.length; i>index; i--) {
array[i] = array[i-1];
}
array[index] = element;
}
使用递减while循环:
function slowSplice2(array, element, index) {
var i = array.length;
while (i > index) {
array[i] = array[--i];
}
array[index] = element;
}
请注意,上面假设一个连续的数组。如果必须容纳稀疏数组,则需要做更多工作。如果要求将函数实现为一般函数,则应遵循splice algorithm from ECMA-262。