Bagaimana cara mengganti item dalam array dengan Javascript?

315

Setiap item dari array ini adalah beberapa nomor.

var items = Array(523,3452,334,31, ...5346);

Bagaimana cara saya mengganti beberapa angka dengan array dengan yang baru?

Misalnya, kami ingin mengganti 3452 dengan 1010, bagaimana kami melakukan ini?

James
sumber
5
Apakah ada beberapa contoh 3452 yang perlu diubah, atau hanya satu?
mellamokb
53
Akan ada satu contoh, jika kekuatan gelap tidak akan menambah satu lagi.
James
2
Ketika ada string ganti mengapa tidak ada replacemetode untuk Array?
lifebalance

Jawaban:

464
var index = items.indexOf(3452);

if (index !== -1) {
    items[index] = 1010;
}

Juga disarankan Anda tidak menggunakan metode konstruktor untuk menginisialisasi array Anda. Sebagai gantinya, gunakan sintaks literal:

var items = [523, 3452, 334, 31, 5346];

Anda juga dapat menggunakan ~operator jika Anda tertarik dengan JavaScript singkat dan ingin mempersingkat-1 perbandingan:

var index = items.indexOf(3452);

if (~index) {
    items[index] = 1010;
}

Kadang-kadang saya bahkan suka menulis containsfungsi untuk mengabstraksi cek ini dan membuatnya lebih mudah untuk memahami apa yang terjadi. Apa yang luar biasa adalah ini berfungsi pada array dan string keduanya:

var contains = function (haystack, needle) {
    return !!~haystack.indexOf(needle);
};

// can be used like so now:
if (contains(items, 3452)) {
    // do something else...
}

Dimulai dengan ES6 / ES2015 untuk string, dan diusulkan untuk ES2016 untuk array, Anda dapat lebih mudah menentukan apakah sumber berisi nilai lain:

if (haystack.includes(needle)) {
    // do your thing
}
Eli
sumber
9
Hanya pikir saya akan memberikan versi ES6 dari contains: var contains = (a, b) => !!~a.indexOf(b): P
Florrie
1
@geon, bisakah Anda jelaskan kerugiannya?
Karl Taylor
1
@ KarlTaylor Hanya saja tidak terlalu idiomatis. Jika Anda dapat menggunakan ES2017, gunakan Array.prototype.includessaja.
geon
1
saya bisa menggunakan IndexOf dengan elemen objek?
ValRob
2
@ValRob tidak, tetapi Anda dapat menggunakan inuntuk melihat apakah suatu objek memiliki kunci (misalnya, 'property' in obj), atau Anda juga dapat mengulangi nilai objek dengan Object.values(obj).forEach(value => {}).
Eli
95

The Array.indexOf()Metode akan menggantikan contoh pertama. Untuk mendapatkan setiap contoh gunakan Array.map():

a = a.map(function(item) { return item == 3452 ? 1010 : item; });

Tentu saja, itu menciptakan array baru. Jika Anda ingin melakukannya di tempat, gunakan Array.forEach():

a.forEach(function(item, i) { if (item == 3452) a[i] = 1010; });
gilly3
sumber
7
Untuk orang lain yang membaca ini. Baik map () dan forEach () adalah tambahan yang lebih baru untuk spesifikasi Javascript dan tidak ada di beberapa browser lama. Jika Anda ingin menggunakannya, Anda mungkin harus menambahkan kode kompatibilitas untuk browser lama: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
jfriend00
2
Array.indexOf()diperkenalkan bersamaan map()dan forEach(). Jika Anda mendukung IE8 atau sebelumnya, dan Anda tidak menggunakan shim untuk menambahkan dukungan, lebih baik ikuti jawaban mellamokb .
gilly3
array.map juga mengembalikan indeks pada parameter kedua mereka a = a.map (fungsi (item, key) {if (item == 3452) a [key] = 1010;});
Ricky sharma
38

Solusi saya yang disarankan adalah:

items.splice(1, 1, 1010);

Operasi sambatan akan menghapus 1 item, mulai dari posisi 1 di array (yaitu 3452), dan akan menggantinya dengan item baru 1010.

Shimon Agassi
sumber
6
Ini menyesatkan karena Anda berkonotasi bahwa parameter pertama berarti 1item tersebut akan dihapus padahal sebenarnya parameter pertama berarti bahwa operasi berlangsung pada indeks 1. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
InsOp
28

Gunakan indexOf untuk menemukan elemen.

var i = items.indexOf(3452);
items[i] = 1010;
Tesserex
sumber
1
bagaimana jika itu tidak diharapkan elemen. jika ditemukan akan mengembalikan indeks elemen yang ditemukan tetapi jika tidak akan mengembalikan -1. dan itu akan menetapkan nilai itu menjadi -1. silakan lihat jsbin.com/wugatuwora/edit?js,console
surekha shelake
23

Mudah dicapai dengan forloop.

for (var i = 0; i < items.length; i++)
    if (items[i] == 3452)
        items[i] = 1010;
mellamokb
sumber
9
Mudah, tetapi belum tentu efisien;)
Eli
7
@Eli: OP tidak jelas apakah mereka mengganti satu instance, atau beberapa instance. Solusi saya menangani banyak contoh.
mellamokb
@Eli Jika ada, ini akan menjadi jawaban paling efisien yang diposting untuk mengganti semua kejadian
Tobiq
15

Anda dapat mengedit sejumlah daftar menggunakan indeks

sebagai contoh :

items[0] = 5;
items[5] = 100;
VirtualTroll
sumber
11

Jika menggunakan objek yang kompleks (atau bahkan yang sederhana) dan Anda dapat menggunakan es6, Array.prototype.findIndexitu bagus. Untuk array OP, mereka bisa melakukannya,

const index = items.findIndex(x => x === 3452)
items[index] = 1010

Untuk objek yang lebih kompleks, ini benar-benar bersinar. Sebagai contoh,

const index = 
    items.findIndex(
       x => x.jerseyNumber === 9 && x.school === 'Ohio State'
    )

items[index].lastName = 'Utah'
items[index].firstName = 'Johnny'
Yatrix
sumber
6

Penggantian dapat dilakukan dalam satu baris:

var items = Array(523, 3452, 334, 31, 5346);

items[items.map((e, i) => [i, e]).filter(e => e[1] == 3452)[0][0]] = 1010

console.log(items);

Atau buat fungsi untuk digunakan kembali:

Array.prototype.replace = function(t, v) {
    if (this.indexOf(t)!= -1)
        this[this.map((e, i) => [i, e]).filter(e => e[1] == t)[0][0]] = v;
  };

//Check
var items = Array(523, 3452, 334, 31, 5346);
items.replace(3452, 1010);
console.log(items);

Artee
sumber
6

Cara ES6 :

const items = Array(523, 3452, 334, 31, ...5346);

Kami ingin menggantinya 3452dengan 1010, solusi:

const newItems = items.map(item => item === 3452 ? 1010 : item);

Tentunya, pertanyaannya adalah selama bertahun-tahun yang lalu dan untuk saat ini saya hanya memilih untuk menggunakan solusi yang tidak dapat diubah , tentu saja, itu luar biasa untuk ReactJS.

Untuk penggunaan yang sering saya tawarkan di bawah ini berfungsi:

const itemReplacer = (array, oldItem, newItem) =>
  array.map(item => item === oldItem ? newItem : item);
Amerika
sumber
4

Metode pertama

Cara terbaik hanya dalam satu baris untuk mengganti atau memperbarui item array

array.splice(array.indexOf(valueToReplace), 1, newValue)

Misalnya:

let items = ['JS', 'PHP', 'RUBY'];

let replacedItem = items.splice(items.indexOf('RUBY'), 1, 'PYTHON')

console.log(replacedItem) //['RUBY']
console.log(items) //['JS', 'PHP', 'PYTHON']

Metode kedua

Cara sederhana lain untuk melakukan operasi yang sama adalah:

items[items.indexOf(oldValue)] = newValue
Tuan-tuan
sumber
3

Cara termudah adalah dengan menggunakan beberapa perpustakaan seperti underscorejs dan metode peta.

var items = Array(523,3452,334,31,...5346);

_.map(items, function(num) {
  return (num == 3452) ? 1010 : num; 
});
=> [523, 1010, 334, 31, ...5346]
mrded
sumber
2
Jenis permintaan lodash / garis bawah menyediakan array-aware replacesekarang ..._.replace([1, 2, 3], 2, 3);
Droogans
3

Cara abadi untuk mengganti elemen dalam daftar menggunakan operator dan .slicemetode penyebaran ES6 .

const arr = ['fir', 'next', 'third'], item = 'next'

const nextArr = [
  ...arr.slice(0, arr.indexOf(item)), 
  'second',
  ...arr.slice(arr.indexOf(item) + 1)
]

Verifikasi itu berfungsi

console.log(arr)     // [ 'fir', 'next', 'third' ]
console.log(nextArr) // ['fir', 'second', 'third']
Purkhalo Alex
sumber
2
var items = Array(523,3452,334,31,5346);

Jika Anda tahu nilainya kemudian gunakan,

items[items.indexOf(334)] = 1010;

Jika Anda ingin tahu bahwa nilai itu ada atau tidak, maka gunakan,

var point = items.indexOf(334);

if (point !== -1) {
    items[point] = 1010;
}

Jika Anda tahu tempat (posisi) maka langsung gunakan,

items[--position] = 1010;

Jika Anda ingin mengganti beberapa elemen, dan Anda hanya tahu posisi awal saja artinya,

items.splice(2, 1, 1010, 1220);

untuk lebih lanjut tentang .splice

KarSho
sumber
1
var index = Array.indexOf(Array value);
        if (index > -1) {
          Array.splice(index, 1);
        }

dari sini Anda dapat menghapus nilai tertentu dari array dan berdasarkan indeks yang sama Anda dapat memasukkan nilai dalam array.

 Array.splice(index, 0, Array value);
Gunjan Kumar
sumber
1

Nah, jika ada yang interresting tentang cara mengganti objek dari indeks dalam array, berikut ini solusinya.

Temukan indeks objek dengan idnya:

const index = items.map(item => item.id).indexOf(objectId)

Ganti objek menggunakan metode Object.assign ():

Object.assign(items[index], newValue)
faye.babacar78
sumber
1

Jawaban dari @ gilly3 bagus.

Cara memperluas ini untuk berbagai objek

Saya lebih suka cara berikut untuk memperbarui catatan baru yang diperbarui ke dalam array catatan saya ketika saya mendapatkan data dari server. Itu membuat pesanan tetap utuh dan cukup lurus ke depan satu liner.

users = users.map(u => u.id !== editedUser.id ? u : editedUser);

var users = [
{id: 1, firstname: 'John', lastname: 'Sena'},
{id: 2, firstname: 'Serena', lastname: 'Wilham'},
{id: 3, firstname: 'William', lastname: 'Cook'}
];

var editedUser = {id: 2, firstname: 'Big Serena', lastname: 'William'};

users = users.map(u => u.id !== editedUser.id ? u : editedUser);

console.log('users -> ', users);

muasif80
sumber
0

Pertama, tulis ulang array Anda seperti ini:

var items = [523,3452,334,31,...5346];

Selanjutnya, akses elemen dalam array melalui nomor indeksnya. Rumus untuk menentukan nomor indeks adalah:n-1

Untuk mengganti item pertama (n=1)dalam array, tulis:

items[0] = Enter Your New Number;

Dalam contoh Anda, angkanya 3452ada di posisi kedua (n=2). Jadi rumus untuk menentukan angka indeks adalah 2-1 = 1. Jadi tulis kode berikut untuk mengganti 3452dengan 1010:

items[1] = 1010;
Anthony Levato
sumber
0

Inilah jawaban dasar yang dibuat menjadi fungsi yang dapat digunakan kembali:

function arrayFindReplace(array, findValue, replaceValue){
    while(array.indexOf(findValue) !== -1){
        let index = array.indexOf(findValue);
        array[index] = replaceValue;
    }
}
JohnP2
sumber
1
biarkan indeks; while ((index = indexOf (findValue))! == -1) untuk menghindari double indexOf (findValue)
Juan R
0

Saya memecahkan masalah ini menggunakan untuk loop dan iterasi melalui array asli dan menambahkan posisi pencocokan arreas ke array lain dan kemudian mengulang melalui array itu dan mengubahnya dalam array asli kemudian mengembalikannya, saya menggunakan fungsi panah tetapi fungsi biasa akan bekerja juga.

var replace = (arr, replaceThis, WithThis) => {
    if (!Array.isArray(arr)) throw new RangeError("Error");
    var itemSpots = [];
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] == replaceThis) itemSpots.push(i);
    }

    for (var i = 0; i < itemSpots.length; i++) {
        arr[itemSpots[i]] = WithThis;
    }

    return arr;
};
J. Svec
sumber
0
presentPrompt(id,productqty) {
    let alert = this.forgotCtrl.create({
      title: 'Test',
      inputs: [
        {
          name: 'pickqty',
          placeholder: 'pick quantity'
        },
        {
          name: 'state',
          value: 'verified',
          disabled:true,
          placeholder: 'state',

        }
      ],
      buttons: [
        {
          text: 'Ok',
          role: 'cancel',
          handler: data => {

            console.log('dataaaaname',data.pickqty);
            console.log('dataaaapwd',data.state);


          for (var i = 0; i < this.cottonLists.length; i++){

            if (this.cottonLists[i].id == id){
                this.cottonLists[i].real_stock = data.pickqty;

            }
          }

          for (var i = 0; i < this.cottonLists.length; i++){

            if (this.cottonLists[i].id == id){
              this.cottonLists[i].state = 'verified';   

          }
        }
            //Log object to console again.
            console.log("After update: ", this.cottonLists)
            console.log('Ok clicked');
          }
        },

      ]
    });
    alert.present();
  }

As per your requirement you can change fields and array names.
thats all. Enjoy your coding.
mahendren
sumber
0

Cara termudah adalah ini.

var items = Array(523,3452,334,31, 5346);
var replaceWhat = 3452, replaceWith = 1010;
if ( ( i = items.indexOf(replaceWhat) ) >=0 ) items.splice(i, 1, replaceWith);

console.log(items);
>>> (5) [523, 1010, 334, 31, 5346]
Vladimir Prudnikov
sumber
tidak berfungsi untuk item yang ditemukan di indeks 0 replaceWhat = 523, replaceWith = 999999tidak menghasilkan hasil yang benar
Anthony Chung
0

Ini satu liner. Diasumsikan bahwa item akan berada dalam array.

var items = [523, 3452, 334, 31, 5346]
var replace = (arr, oldVal, newVal) => (arr[arr.indexOf(oldVal)] = newVal, arr)
console.log(replace(items, 3452, 1010))

Alex Cory
sumber
0

Jika Anda ingin oneliner gula sintax sederhana, Anda bisa:

(elements = elements.filter(element => element.id !== updatedElement.id)).push(updatedElement);

Suka:

let elements = [ { id: 1, name: 'element one' }, { id: 2, name: 'element two'} ];
const updatedElement = { id: 1, name: 'updated element one' };

Jika Anda tidak memiliki id, Anda dapat merangkai elemen seperti:

(elements = elements.filter(element => JSON.stringify(element) !== JSON.stringify(updatedElement))).push(updatedElement);
Marco Silva
sumber