Cara memasukkan item ke dalam array pada indeks tertentu (JavaScript)?

Saya mencari JavaScript array menyisipkan metode, dalam gaya:

arr.insert(index, item)

Sebaiknya dalam jQuery, tapi JavaScript pelaksanaan akan dilakukan pada saat ini.

Mengomentari pertanyaan (5)
Larutan

Apa yang anda inginkan adalah sambatan fungsi asli array objek.

arr.sambatan(indeks, 0, item); akan memasukkan barang ke arr pada indeks tertentu (menghapus 0 item pertama, yaitu,'s hanya insert).

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

Anda dapat menerapkan Array.menyisipkan metode dengan melakukan hal ini:

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

Kemudian anda dapat menggunakannya seperti:

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

// => arr == [ 'A', 'B', 'C', 'D', 'E' ]
Komentar (9)

Selain sambatan, anda dapat menggunakan pendekatan ini yang tidak akan bermutasi asli array, tapi akan membuat array baru dengan menambahkan item. Anda biasanya harus menghindari mutasi kapanpun mungkin. I'm menggunakan ES6 menyebar operator 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]

Hal ini dapat digunakan untuk menambahkan lebih dari satu item dengan mengutak-atik fungsi nyaman untuk digunakan beristirahat operator untuk item baru, dan menyebar bahwa dalam hasil kembali 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]
Komentar (2)

Custom array insert metode

1. Dengan beberapa argumen dan chaining dukungan

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

Hal ini dapat menyisipkan beberapa elemen (seperti asli sambatan tidak) dan mendukung chaining:

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

2. Dengan array-jenis argumen penggabungan dan chaining dukungan

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

Hal ini dapat menggabungkan array dari argumen-argumen yang diberikan array 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/

Komentar (5)

Jika anda ingin memasukkan beberapa elemen ke dalam array sekaligus check out Stack Overflow menjawab: https://stackoverflow.com/questions/1348178/a-better-way-to-splice-an-arrray-into-an-array-in-javascript

Juga di sini adalah beberapa fungsi untuk menggambarkan 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 melihat untuk diri anda: 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);
Komentar (3)

Untuk yang tepat pemrograman fungsional dan chaining tujuan penemuan Array.prototipe.insert() adalah penting. Sebenarnya sambatan bisa menjadi sempurna jika itu telah kembali bermutasi array, bukan yang benar-benar berarti array kosong. Jadi di sini ia pergi

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 di atas dengan Array.prototipe.splice() satu file, asli array dan beberapa mungkin mengeluh seperti "anda tidak't memodifikasi apa yang doesn't milik anda" dan itu mungkin benar juga. Jadi untuk kesejahteraan masyarakat saya ingin memberikan yang lain Array.prototipe.insert() yang doesn't bermutasi asli array. Di sini ia pergi;

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));
Komentar (4)

Saya sarankan menggunakan murni JavaScript dalam kasus ini, juga tidak ada menyisipkan metode dalam JavaScript, tapi kami memiliki metode yang built-in Hotel metode yang melakukan pekerjaan untuk anda, it's disebut sambatan...

Let's melihat apa yang's splice()...

sambatan() metode perubahan isi sebuah array dengan menghapus unsur-unsur yang ada dan/atau menambahkan elemen baru.

OK, bayangkan kita memiliki array ini di bawah ini:

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

Kita dapat menghapus 3 seperti ini:

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

Itu akan kembali 3, tetapi jika kita memeriksa arr sekarang, kita memiliki:

[1, 2, 4, 5]

Sejauh ini, begitu baik, tapi bagaimana kita dapat menambahkan elemen baru untuk menggunakan array splice? Let's dimasukkan kembali 3 di arr...

arr.splice(2, 0, 3);

Let's melihat apa yang telah kita lakukan...

Kami menggunakan sambatan lagi, tapi kali ini untuk argumen kedua, kita lulus 0, berarti kita ingin menghapus no item, tapi pada saat yang sama, kita menambahkan argumen ketiga yaitu 3 yang akan ditambahkan di kedua indeks...

Anda harus menyadari, bahwa kita dapat hapus dan menambahkan di waktu yang sama, misalnya sekarang yang bisa kita lakukan:

arr.splice(2, 2, 3);

Yang akan menghapus 2 item pada indeks 2, kemudian tambahkan 3 pada indeks 2 dan hasilnya akan menjadi:

[1, 2, 3, 5];

Ini menunjukkan bagaimana masing-masing item dalam sambatan bekerja:

array.sambatan(mulai, deleteCount, item1, item2, item3 ...)

Komentar (0)

Menambahkan Satu Elemen pada indeks tertentu

//Append at specific position(here at index 1)
arrName.splice(1, 0,'newName1');
//1: index number, 0: number of element to remove, newName1: new element

//Append at specific position (here at index 3)
arrName[3] = 'newName1';

Tambahkan Beberapa Elemen pada indeks tertentu

//Append from index number 1
arrName.splice(1, 0,'newElemenet1', 'newElemenet2', 'newElemenet3');
//1: index number from where append start, 
//0: number of element to remove, 
//newElemenet1,2,3: new elements
Komentar (5)

Solusi lain yang mungkin, dengan penggunaan Array#mengurangi.

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);
Komentar (0)

Meskipun hal ini telah terjawab sudah, aku'm menambahkan catatan ini untuk pendekatan alternatif.

Aku ingin ke tempat a dikenal * jumlah** item ke dalam array, ke posisi tertentu, karena mereka datang dari sebuah "array asosiatif" (yaitu objek) yang menurut definisi ini tidak dijamin untuk berada di urutan diurutkan. Aku ingin dihasilkan array menjadi sebuah array dari benda-benda, tetapi benda-benda dalam urutan tertentu dalam array karena array adalah pesanan mereka. Jadi yang saya lakukan ini.

Pertama sumber objek, JSONB string yang diambil dari PostgreSQL. Aku ingin memilikinya diurutkan berdasarkan "order" properti di masing-masing 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 node pada obyek yang diketahui, saya terlebih dahulu membuat sebuah array dengan panjang tertentu:

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

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

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);
Komentar (0)

Saya mencoba ini dan itu bekerja dengan baik!

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

Index adalah posisi di mana anda ingin menyisipkan atau menghapus elemen. 0 yaitu kedua parameter mendefinisikan jumlah elemen dari index yang akan dihapus item ini adalah entri baru yang ingin anda buat dalam array. Hal ini dapat menjadi salah satu atau lebih dari satu.

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

Siapa pun yang's masih mengalami masalah dengan yang satu ini dan telah mencoba semua pilihan di atas dan tidak pernah mendapatkannya. I'm berbagi solusi saya, ini adalah untuk mengambil pertimbangan bahwa anda don't wan't untuk secara eksplisit menyatakan sifat-sifat obyek dibandingkan dengan array.

function isIdentical(left, right){
    return JSON.stringify(left) === JSON.stringify(right);
}

function contains(array, obj){
    let count = 0;
    array.map((cur) => {
          if(this.isIdentical(cur, obj)) count++;
    });
    return count > 0;
}

Ini adalah kombinasi dari iterasi referensi array dan membandingkannya dengan objek yang anda ingin memeriksa, mengubah mereka berdua menjadi sebuah string maka iterasi jika itu cocok. Maka anda hanya dapat menghitung. Hal ini dapat ditingkatkan tapi ini adalah di mana saya menetap. Semoga ini bisa membantu.

Komentar (0)

Mengambil keuntungan dari mengurangi metode sebagai berikut:

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

Jadi dengan cara ini kita dapat mengembalikan array baru (akan menjadi keren cara fungsional - lebih banyak lebih baik daripada menggunakan push atau sambatan) dengan elemen dimasukkan di index, dan jika indeks lebih besar dari panjang array itu akan dimasukkan di akhir.

Komentar (0)

Berikut adalah dua cara :

const array = [ 'My', 'name', 'Hamza' ];

array.splice(2, 0, 'is');

console.log("Method 1 : ", array.join(" "));

ATAU

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

const array = [ 'My', 'name', 'Hamza' ];
array.insert(2, 'is');

console.log("Method 2 : ", array.join(" "));
Komentar (0)

Sedikit lebih tua thread, tapi aku harus setuju dengan Redu di atas karena sambatan pasti memiliki sedikit membingungkan antarmuka. Dan respon yang diberikan oleh cdbajorin bahwa "itu hanya mengembalikan array kosong ketika parameter kedua adalah 0. Jika itu's lebih besar dari 0, itu kembali barang-barang yang dihapus dari array", sedangkan yang akurat, membuktikan titik. Fungsi's tujuannya adalah untuk sambatan atau seperti dikatakan sebelumnya oleh Jakob Keller, "untuk bergabung atau menghubungkan, juga berubah. Anda memiliki array yang anda sekarang berubah yang akan melibatkan menambahkan atau menghapus unsur-unsur...." yang Diberikan itu, nilai kembali dari unsur-unsur, jika ada, yang telah dihapus canggung di terbaik. Dan saya 100% setuju bahwa metode ini bisa saja lebih cocok untuk chaining jika itu telah kembali apa yang tampak alami, array baru dengan elemen-elemen yang disambung menambahkan. Kemudian anda bisa melakukan hal-hal seperti ["19", "17"].sambatan(1,0,"18").bergabung("...") atau apapun yang anda suka dengan array kembali. Fakta bahwa hal itu kembali apa yang telah dihapus adalah hanya agak omong kosong IMHO. Jika maksud dari metode ini adalah untuk "memotong satu set unsur-unsur" dan itu's hanya niat, mungkin. Sepertinya jika saya don't tahu apa yang saya'm memotong meskipun sudah, saya mungkin memiliki sedikit alasan untuk memotong unsur-unsur luar, doesn't itu? Akan lebih baik jika ia berperilaku seperti concat, peta, mengurangi, iris, dll di mana sebuah array baru yang terbuat dari array yang ada daripada bermutasi array yang ada. Mereka semua chainable, dan itu ADALAH masalah yang signifikan. It's agak umum untuk rantai manipulasi array. Sepertinya bahasa perlu pergi satu atau arah lain dan mencoba untuk tetap sebanyak mungkin. Javascript yang fungsional dan kurang deklaratif, sepertinya aneh penyimpangan dari norma.

Komentar (0)

Berikut ini's bekerja fungsi itu saya menggunakan salah satu aplikasi saya.

Ini memeriksa apakah item keluar

let ifExist = (item, strings = [ '' ], position = 0) => {
     // output into an array with empty string. Important just in case their is no item. 
    let output = [ '' ];
    // check to see if the item that will be positioned exist.
    if (item) {
        // output should equal to array of strings. 
        output = strings;
       // use splice in order to break the array. 
       // use positition param to state where to put the item
       // and 0 is to not replace an index. Item is the actual item we are placing at the prescribed position. 
        output.splice(position, 0, item);
    }
    //empty string is so we do not concatenate with comma or anything else. 
    return output.join("");
};

Dan kemudian saya sebut di bawah ini.

ifExist("friends", [ ' ( ', ' )' ], 1)}  // output: ( friends )
ifExist("friends", [ ' - '], 1)}  // output:  - friends 
ifExist("friends", [ ':'], 0)}  // output:   friends: 
Komentar (0)