Как вставить элемент в массив по определенному индексу?

Я ищу метод вставки массива Javascript в стиле:

arr.insert(index, item)

Предпочтительно в jQuery, но любая реализация Javascript будет делать на этом этапе.

1766
задан tags2k 25 февр. '09 в 17:29
источник поделиться
10 ответов

Вы хотите использовать функцию splice в собственном массиве.

arr.splice(index, 0, item); будет вставлять item в arr по указанному индексу (сначала удаляя элементы 0, то есть это просто вставка).

В этом примере мы создадим массив и добавим в него элемент в индекс 2:

var arr = [];
arr[0] = "Jani";
arr[1] = "Hege";
arr[2] = "Stale";
arr[3] = "Kai Jim";
arr[4] = "Borge";

console.log(arr.join());
arr.splice(2, 0, "Lene");
console.log(arr.join());

Вывод кода выше:

Jani,Hege,Stale,Kai Jim,Borge
Jani,Hege,Lene,Stale,Kai Jim,Borge
2948
ответ дан tvanfosson 25 февр. '09 в 17:32
источник поделиться

Вы можете реализовать метод Array.insert, выполнив следующее:

Array.prototype.insert = function ( index, item ) {
    this.splice( index, 0, item );
};

Затем вы можете использовать его как:

var arr = [ 'A', 'B', 'D', 'E' ];
arr.insert(2, 'C');

// => arr == [ 'A', 'B', 'C', 'D', 'E' ]
187
ответ дан FrEsC 81 03 окт. '12 в 17:26
источник поделиться

Методы пользовательского массива insert

1. С несколькими аргументами и поддержкой цепочки

/* Syntax:
   array.insert(index, value1, value2, ..., valueN) */

Array.prototype.insert = function(index) {
    this.splice.apply(this, [index, 0].concat(
        Array.prototype.slice.call(arguments, 1)));
    return this;
};

Он может вставлять несколько элементов (как родной splice) и поддерживает цепочку:

["a", "b", "c", "d"].insert(2, "X", "Y", "Z").slice(1, 6);
// ["b", "X", "Y", "Z", "c"]

2. С поддержкой массива слияния и привязки аргументов

/* Syntax:
   array.insert(index, value1, value2, ..., valueN) */

Array.prototype.insert = function(index) {
    index = Math.min(index, this.length);
    arguments.length > 1
        && this.splice.apply(this, [index, 0].concat([].pop.call(arguments)))
        && this.insert.apply(this, arguments);
    return this;
};

Он может объединять массивы из аргументов с данным массивом, а также поддерживает цепочку:

["a", "b", "c", "d"].insert(2, "V", ["W", "X", "Y"], "Z").join("-");
// "a-b-V-W-X-Y-Z-c-d"

DEMO: http://jsfiddle.net/UPphH/

57
ответ дан VisioN 25 марта '13 в 20:45
источник поделиться

Если вы хотите вставить несколько элементов в массив сразу, проверьте этот ответ: Лучший способ сращивания массива в массив в javascript

Также приведены некоторые функции, иллюстрирующие оба примера:

function insertAt(array, index) {
    var arrayToInsert = Array.prototype.splice.apply(arguments, [2]);
    return insertArrayAt(array, index, arrayToInsert);
}

function insertArrayAt(array, index, arrayToInsert) {
    Array.prototype.splice.apply(array, [index, 0].concat(arrayToInsert));
    return array;
}

Наконец, вот jsFiddle, чтобы вы могли увидеть его сами: http://jsfiddle.net/luisperezphd/Wc8aS/

И вот как вы используете функции:

// if you want to insert specific values whether constants or variables:
insertAt(arr, 1, "x", "y", "z");

// OR if you have an array:
var arrToInsert = ["x", "y", "z"];
insertArrayAt(arr, 1, arrToInsert);
29
ответ дан Luis Perez 30 авг. '12 в 7:37
источник поделиться

Кроме сращивания, вы можете использовать этот подход, который не будет мутировать исходный массив, но создаст новый массив с добавленным элементом. Обычно вам следует избегать мутации. Я использую оператор распространения ES6 здесь.

const items = [1, 2, 3, 4, 5]

const insert = (arr, index, newItem) => [
  // part of the array before the specified index
  ...arr.slice(0, index),
  // inserted item
  newItem,
  // part of the array after the specified index
  ...arr.slice(index)
]

const result = insert(items, 1, 10)

console.log(result)
// [1, 10, 2, 3, 4, 5]

Это может быть использовано для добавления нескольких элементов путем настройки функции бит для использования оператора rest для новых элементов и распространения этого результата в возвращенном виде.

const items = [1, 2, 3, 4, 5]

const insert = (arr, index, ...newItems) => [
  // part of the array before the specified index
  ...arr.slice(0, index),
  // inserted items
  ...newItems,
  // part of the array after the specified index
  ...arr.slice(index)
]

const result = insert(items, 1, 10, 20)

console.log(result)
// [1, 10, 20, 2, 3, 4, 5]
29
ответ дан Gaafar 04 июля '16 в 12:18
источник поделиться

Для правильного функционального программирования и целенаправленности важно изобретение Array.prototype.insert(). На самом деле сплайсинг мог бы быть идеальным, если бы он вернул мутированный массив вместо абсолютно бессмысленного пустого массива. Итак, вот оно

Array.prototype.insert = function(i,...rest){
  this.splice(i,0,...rest)
  return this
}

var a = [3,4,8,9];
document.write("<pre>" + JSON.stringify(a.insert(2,5,6,7)) + "</pre>");

Хорошо, что выше с помощью Array.prototype.splice() один мутирует исходный массив, а некоторые могут жаловаться, как "вы не должны изменять то, что не принадлежит вам", и это может оказаться правильным. Поэтому для общественного благосостояния я хотел бы дать еще один Array.prototype.insert(), который не будет мутировать исходный массив. Вот оно:

Array.prototype.insert = function(i,...rest){
  return this.slice(0,i).concat(rest,this.slice(i));
}

var a = [3,4,8,9],
    b = a.insert(2,5,6,7);
console.log(JSON.stringify(a));
console.log(JSON.stringify(b));
12
ответ дан Redu 14 мая '16 в 2:22
источник поделиться

Это:

var arr= ["India","China","Japan","USA"];

arr.splice(index, 0, item);

Введет элемент в arr с указанным index (сначала удалив 0 элементов, то есть просто вставку).

8
ответ дан hannad rehman 24 февр. '17 в 16:29
источник поделиться

Даже если на это уже был дан ответ, я добавляю эту заметку для альтернативного подхода.

Я хотел помещать известный номер элементов в массив, в определенные публикации, поскольку они отрываются от "ассоциативного массива" (т.е. объекта), который по определению не гарантирован в отсортированном порядке. Я хотел, чтобы результирующий массив был массивом объектов, но объекты были в определенном порядке в массиве, так как массив гарантирует их порядок. Поэтому я сделал это.

Сначала исходный объект, строка JSONB, полученная из PostgreSQL. Я хотел, чтобы он отсортировался по свойству "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);
4
ответ дан Ville 04 дек. '15 в 21:36
источник поделиться

Другое возможное решение с использованием Array#reduce.

var arr = ["apple", "orange", "raspberry"],
    arr2 = [1, 2, 4];

function insert(arr, item, index) {
    arr = arr.reduce(function(s, a, i) {
      i == index ? s.push(item, a) : s.push(a);
      return s;
    }, []);   
    console.log(arr);
}

insert(arr, "banana", 1);
insert(arr2, 3, 2);
3
ответ дан Konrad D 05 апр. '17 в 20:06
источник поделиться

Я пробовал это, и он отлично работает!!!!

var initialArr = ["India","China","Japan","USA"];
initialArr.splice(index, 0, item);

Указатель - это позиция, в которую вы хотите вставить или удалить элемент. 0 i.e второй параметр определяет количество элементов из индекса, подлежащего удалению item - новые записи, которые вы хотите создать в массиве. Это может быть один или несколько.

initialArr.splice(2, 0, "Nigeria");
initialArr.splice(2, 0, "Australia","UK");
0
ответ дан Pawan 08 марта '17 в 9:35
источник поделиться

Другие вопросы по меткам