无法在给定的数组索引处插入数字

Unable to insert a number at a given array index

有人可以向我解释为什么我的代码不起作用吗?

它应该将第二个 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,所以我的知识有限。 非常感谢任何建议或帮助。

这里有一些问题。

  1. 必须通过数组调用方法。即 arr.slice()slice(...) 将引发错误。
  2. slice 不会添加到数组中。它从数组中删除。您需要使用 splice.
  3. 在这里像您一样使用 for 循环并不是最好的方法,因为它会在您插入元素后继续运行。本质上,您想将元素插入到有序列表中?如果是这样,请在插入元素后立即使用 return 或使用 break.
  4. 退出该函数

您的函数可能如下所示:

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);

但是,你的问题有点模棱两可,所以如果你想在特定索引处插入一个元素,你可以直接使用 splice:

var arr = [1, 5];
// Inserts 3 at index of 1
arr.splice(1, 0, 3);
// arr becomes [1, 3, 5]

我不确定你想在这里做什么,但是:

  • 我认为 "slice" 函数没有达到您的预期;你应该在 Array 上调用它,参见 here,它 return 是一个 new 数组,所以你必须将结果分配给 something

  • 但是,您只看到 (3) 的原因是因为您从未调用您定义的 ẁhere 函数。相反,您正在计算 ([1,5],3) 的值,并将其影响到一个名为 where.

  • 的新全局变量

([1,5],3) 的值为“3”的原因是 comma operator。基本上:

([1,5],3)

相同
[1,5],3

计算 [1,5]3,return 最后计算的值 (3)

尝试将最后一行更改为实际的函数调用:

var result = where([1, 5],3);

由于调用 slice 的方式,您会遇到错误;希望通过文档,您应该了解如何使其工作。

此外,正如其他地方所指出的,slice 可能不是您首先要调用的函数。

我想你想要像 dichotomic searcharr.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]