有人可以向我解释为什么我的代码不起作用吗?
它应该将第二个arg(3
)放在arr([1,5]
)之间。但JS告诉我的唯一事情是" 3"。
function where(arr, num){
for(var i=0;i<arr.length;i++){
if(arr[i] < num){
slice(arr[i+1,0,num])
}
else if(arr[i] > num){
slice(arr[i+1,0,num])
}
}
return arr;
}
where = ([1, 5],3);
请知道,我刚开始使用JS,所以我的知识有限。 任何建议或帮助都非常感谢。
答案 0 :(得分:1)
这里有一些问题。
arr.slice()
而slice(...)
会抛出错误。slice
不会添加到数组中。它从数组中删除。您需要使用splice
。for
循环并不是最好的方法,因为它会在插入元素后继续运行。基本上,您想要将元素插入有序列表?如果是这样,请在插入元素后立即使用return
退出该功能,或使用break
。您的功能可能如下所示:
function where (arr, num) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] > num) {
// Inserts num at i
arr.splice(i, 0, num);
return arr;
}
}
// If it's the highest num, add to the end of the array.
arr.push(num);
return arr;
}
var newArray = where([1, 5], 3);
但是,您的问题有点模棱两可,因此,如果您尝试在特定索引处插入元素,则可以直接使用拼接:
var arr = [1, 5];
// Inserts 3 at index of 1
arr.splice(1, 0, 3);
// arr becomes [1, 3, 5]
答案 1 :(得分:0)
我不确定你在这里做了什么,但是:
我不认为&#34;切片&#34;功能做你期望的;您应该在数组上调用它,请参阅here,它会返回一个 new 数组,因此您必须将结果分配给某些内容
但是,您只看到(3
)的原因是您从未调用您定义的ẁhere
函数。相反,您正在计算([1,5],3)
的值,并将其影响到名为where
的新全局变量。
([1,5],3)
有价值的原因&#34; 3&#34;是因为comma operator。基本上:
([1,5],3)
与
相同[1,5],3
评估[1,5]
和3
,并返回上次评估的值(3
)
尝试将最后一行更改为实际的函数调用:
var result = where([1, 5],3);
由于你称之为切片,你会得到错误;希望通过该文档,您应该看到如何使其工作。
另外,正如其他地方所指出的,slice
可能不是您想要首先调用的函数。
答案 2 :(得分:0)
我认为您需要dichotomic search和arr.splice
之类的合适位置:
function insertItemInOrderedArray(arr, item, from, to) {
if(from === undefined) from = 0;
if(to === undefined) to = arr.length;
if(from >= to) return arr.splice(from, 0, item), arr;
var m = (from + to) / 2 | 0;
if(arr[m] > item) return insertItemInOrderedArray(arr, item, from, m);
if(arr[m] < item) return insertItemInOrderedArray(arr, item, m+1, to);
return arr;
}
insertItemInOrderedArray([1,5], 3); // [1,3,5]