我正在寻找一个JavaScript数组插入方法,样式如下:

arr.insert(index, item)

最好是在jQuery中,但此时任何JavaScript实现都可以。


当前回答

我不得不同意Redu的回答,因为splice()的界面确实有点混乱。cdbajorin给出的响应是“当第二个参数为0时,它只返回一个空数组。如果它大于0,则返回从数组中删除的项“虽然准确,但证明了这一点。

该功能的目的是拼接,或者如Jakob Keller先前所说,“连接或连接,也改变。

您有一个已建立的阵列,现在正在更改,这将涉及添加或删除元素。。。。“考虑到这一点,被删除的元素(如果有的话)的返回值充其量是尴尬的。我100%同意,如果该方法返回了一个看起来很自然的新数组,添加了拼接元素,则该方法可能更适合于链接。然后,您可以对返回的数组执行类似[”19“,”17“].splice(1,0,”18“).join(”…“)之类的操作。

它返回删除的内容这一事实简直是无稽之谈。如果该方法的目的是“删除一组元素”,而这是它唯一的目的,也许。似乎如果我不知道我已经剪了什么,我可能没有什么理由剪掉这些元素,不是吗?

如果它表现得像concat()、map()、reduce()、slice()等,从现有数组生成新数组,而不是改变现有数组,那会更好。这些都是可链接的,这是一个重要的问题。链数组操作非常常见。

似乎语言需要朝一个或另一个方向发展,并尽可能地坚持下去。JavaScript具有功能性,声明性较低,这似乎是一种与规范的奇怪偏差。

其他回答

下面是一个支持同时插入多个值的简单函数:

function add_items_to_array_at_position(array, index, new_items)
{
    return [...array.slice(0, index), ...new_items, ...array.slice(index)];
}

用法示例:

let old_array = [1,2,5];

let new_array = add_items_to_array_at_position(old_array, 2, [3,4]);

console.log(new_array);

//Output: [1,2,3,4,5]

我不得不同意Redu的回答,因为splice()的界面确实有点混乱。cdbajorin给出的响应是“当第二个参数为0时,它只返回一个空数组。如果它大于0,则返回从数组中删除的项“虽然准确,但证明了这一点。

该功能的目的是拼接,或者如Jakob Keller先前所说,“连接或连接,也改变。

您有一个已建立的阵列,现在正在更改,这将涉及添加或删除元素。。。。“考虑到这一点,被删除的元素(如果有的话)的返回值充其量是尴尬的。我100%同意,如果该方法返回了一个看起来很自然的新数组,添加了拼接元素,则该方法可能更适合于链接。然后,您可以对返回的数组执行类似[”19“,”17“].splice(1,0,”18“).join(”…“)之类的操作。

它返回删除的内容这一事实简直是无稽之谈。如果该方法的目的是“删除一组元素”,而这是它唯一的目的,也许。似乎如果我不知道我已经剪了什么,我可能没有什么理由剪掉这些元素,不是吗?

如果它表现得像concat()、map()、reduce()、slice()等,从现有数组生成新数组,而不是改变现有数组,那会更好。这些都是可链接的,这是一个重要的问题。链数组操作非常常见。

似乎语言需要朝一个或另一个方向发展,并尽可能地坚持下去。JavaScript具有功能性,声明性较低,这似乎是一种与规范的奇怪偏差。

尽管这个问题已经得到了回答,但我还是添加了这个注释作为替代方法。

我想将已知数量的项目放入一个数组中,放入特定位置,因为它们来自一个“关联数组”(即一个对象),根据定义,该数组不能保证按排序顺序排列。我希望得到的数组是一个对象数组,但是对象在数组中的顺序是特定的,因为数组保证了它们的顺序。所以我这样做了。

首先是源对象,一个从PostgreSQL检索的JSONB字符串。我想让它按每个子对象中的“order”属性排序。

var jsonb_str = '{"one": {"abbr": "", "order": 3}, "two": {"abbr": "", "order": 4}, "three": {"abbr": "", "order": 5}, "initialize": {"abbr": "init", "order": 1}, "start": {"abbr": "", "order": 2}}';

var jsonb_obj = JSON.parse(jsonb_str);

由于对象中的节点数是已知的,因此我首先创建一个具有指定长度的数组:

var obj_length = Object.keys(jsonb_obj).length;
var sorted_array = new Array(obj_length);

然后迭代对象,将新创建的临时对象放置到数组中所需的位置,而不进行任何“排序”。

for (var key of Object.keys(jsonb_obj)) {
  var tobj = {};
  tobj[key] = jsonb_obj[key].abbr;

  var position = jsonb_obj[key].order - 1;
  sorted_array[position] = tobj;
}

console.dir(sorted_array);

按以下方式计算减少方法的利润:

function insert(arr, val, index) {
    return index >= arr.length
        ? arr.concat(val)
        : arr.reduce((prev, x, i) => prev.concat(i === index ? [val, x] : x), []);
}

因此,通过这种方式,我们可以返回一个新数组(这将是一种很酷的函数方式,比使用push或splice要好得多),其中元素插入索引处,如果索引大于数组长度,则将在末尾插入。

以下是现代(字体功能)方式:

export const insertItemInList = <T>(
  arr: T[],
  index: number,
  newItem: T
): T[] => [...arr.slice(0, index), newItem, ...arr.slice(index)]