Pertanyaan Bagaimana cara memasukkan item ke dalam array pada indeks tertentu?


Saya mencari metode insert jajaran Javascript, dalam gaya:

arr.insert(index, item)

Lebih disukai di jQuery, tetapi setiap implementasi Javascript akan dilakukan pada titik ini.


2075
2018-02-25 14:29


asal


Jawaban:


Yang Anda inginkan adalah splice berfungsi pada objek array asli.

arr.splice(index, 0, item); akan disisipkan item ke arr pada indeks yang ditentukan (menghapus 0 item pertama, artinya, itu hanya sebuah sisipan).

Dalam contoh ini kita akan membuat array dan menambahkan elemen ke dalam indeks 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());


3437
2018-02-25 14:32



Anda dapat menerapkan Array.insert metode dengan melakukan ini:

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

Maka Anda dapat menggunakannya seperti:

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

// => arr == [ 'A', 'B', 'C', 'D', 'E' ]

207
2017-10-03 14:26



Array khusus insert metode

1. Dengan banyak argumen dan dukungan chaining

/* 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;
};

Dapat memasukkan beberapa elemen (sebagai asli splice tidak) dan mendukung chaining:

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

2. Dengan argumen array-jenis menggabungkan dan dukungan chaining

/* 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;
};

Ini dapat menggabungkan array dari argumen dengan array yang diberikan dan juga mendukung chaining:

["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/


63
2018-03-25 17:45



Selain sambatan, Anda dapat menggunakan pendekatan ini yang tidak akan memutasi susunan asli, tetapi akan membuat larik baru dengan item yang ditambahkan. Anda biasanya harus menghindari mutasi bila memungkinkan. Saya menggunakan operator penyebaran ES6 di sini.

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]

Ini dapat digunakan untuk menambahkan lebih dari satu item dengan mengutak-atik fungsi sedikit untuk menggunakan operator sisanya untuk item baru, dan sebarkan itu di hasil yang dikembalikan juga

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]


54
2017-07-04 09:18



Jika Anda ingin memasukkan beberapa elemen ke dalam array sekaligus, periksa jawaban Stack Overflow ini: Cara yang lebih baik untuk menghubungkan array ke dalam array dalam javascript

Juga di sini ada beberapa fungsi untuk mengilustrasikan kedua contoh:

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

Akhirnya di sini adalah jsFiddle sehingga Anda dapat melihatnya sendiri: http://jsfiddle.net/luisperezphd/Wc8aS/

Dan ini adalah bagaimana Anda menggunakan fungsi:

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

33
2017-08-30 04:37



Untuk pemrograman fungsional yang tepat dan tujuan chaining penemuan Array.prototype.insert() sangat penting. Sebenarnya sambatan bisa menjadi sempurna jika telah mengembalikan array yang dimutasi bukan array kosong yang benar-benar tidak berarti. Jadi begini

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

Nah ok yang diatas dengan Array.prototype.splice() salah satu bermutasi array asli dan beberapa mungkin mengeluh seperti "Anda tidak boleh mengubah apa yang bukan milik Anda" dan yang mungkin berubah menjadi benar juga. Jadi untuk kesejahteraan masyarakat saya ingin memberikan yang lain Array.prototype.insert() yang tidak bermutasi array asli. Ini dia;

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


14
2018-05-13 23:22



Saya merekomendasikan menggunakan murni JavaScript dalam hal ini, juga tidak ada metode sisipan di JavaScript, tetapi kami memiliki metode yang a built-in Array metode yang melakukan pekerjaan untuk Anda, itu disebut sambatan...

Mari kita lihat apa sambatan()...

Metode splice () mengubah isi array dengan menghapus   elemen yang ada dan / atau menambahkan elemen baru.

OK, bayangkan kita memiliki array di bawah ini:

const arr = [1, 2, 3, 4, 5];

Kami dapat menghapus 3 seperti ini:

arr.splice(arr.indexOf(3), 1);

Ini akan mengembalikan 3, tetapi jika kita memeriksa arr sekarang, kita memiliki:

[1, 2, 4, 5]

Sejauh ini, sangat bagus, tapi bagaimana kita bisa menambahkan elemen baru ke array menggunakan splice? Mari kita kembali 3 dalam ar ...

arr.splice(2, 0, 3);

Mari kita lihat apa yang telah kita lakukan ...

Kita gunakan sambatan lagi, tetapi kali ini untuk argumen kedua, kita lulus 0, berarti kami ingin menghapus tidak ada item, tetapi pada saat yang sama, kami menambahkan argumen ketiga yaitu 3 yang akan ditambahkan pada indeks kedua ...

Anda harus sadar, bahwa kita bisa menghapus dan menambahkan pada saat yang sama, misalnya sekarang kita bisa melakukan:

arr.splice(2, 2, 3);

Yang akan dihapus 2 item pada indeks 2, lalu tambahkan 3 pada indeks 2 dan hasilnya adalah:

[1, 2, 3, 5];

Ini menunjukkan bagaimana setiap item dalam kerja sambatan:

array.splice (start, deleteCount, item1, item2, item3 ...)


7
2017-12-25 13:04



Solusi lain yang mungkin, dengan penggunaan 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);


5
2018-04-05 17:06



Meskipun ini sudah dijawab, saya menambahkan catatan ini untuk pendekatan alternatif.

Saya ingin menempatkan nomor yang dikenal item ke dalam array, ke posisi tertentu, karena mereka berasal dari "array asosiatif" (yaitu objek) yang menurut definisi tidak dijamin dalam urutan yang diurutkan. Saya ingin array yang dihasilkan menjadi array objek, tetapi objek berada dalam urutan tertentu dalam array karena array menjamin pesanannya. Jadi saya melakukan ini.

Pertama objek sumber, string JSONB diambil dari PostgreSQL. Saya ingin memilikinya diurutkan berdasarkan "pesanan" properti di setiap objek anak.

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

Karena jumlah simpul dalam objek diketahui, saya pertama-tama membuat larik dengan panjang yang ditentukan:

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

Dan kemudian iterate objek, menempatkan objek sementara yang baru dibuat ke lokasi yang diinginkan dalam array tanpa benar-benar ada "pemilahan" yang terjadi.

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

5
2017-12-04 18:36



Saya mencoba ini dan itu berfungsi dengan baik!

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

Indeks adalah posisi di mana Anda ingin memasukkan atau menghapus elemen. 0 yaitu parameter kedua menentukan jumlah elemen dari indeks yang akan dihapus item adalah entri baru yang ingin Anda buat dalam array. Itu bisa satu atau lebih dari satu.

initialArr.splice(2, 0, "Nigeria");
initialArr.splice(2, 0, "Australia","UK");

2
2018-03-08 06:35