Bir dizideki öğeyi Javascript ile nasıl değiştirebilirim?


315

Bu dizinin her öğesi bir sayıdır.

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

Bazı numaraları dizi ile yenisiyle nasıl değiştirebilirim?

Örneğin, 3452'yi 1010 ile değiştirmek istiyoruz, bunu nasıl yapardık?


5
Değiştirilmesi gereken birden fazla 3452 örneği mi var, yoksa sadece biri mi?
mellamokb

53
Karanlık güçler bir tane daha eklemezse, bir örnek olacaktır.
James

2
Ne zaman orada olduğunu dize yerine neden orada bir değil replaceDizileri yöntemi?
cankurtaran

Yanıtlar:


464
var index = items.indexOf(3452);

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

Ayrıca, dizilerinizi başlatmak için yapıcı yöntemini kullanmamanız önerilir. Bunun yerine değişmez sözdizimini kullanın:

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

~İşleç ayrıca kısa JavaScript'e giriyorsanız ve -1karşılaştırmayı kısaltmak istiyorsanız da kullanabilirsiniz :

var index = items.indexOf(3452);

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

Bazen containsbu kontrolü soyutlamak ve neler olduğunu anlamayı kolaylaştırmak için bir işlev yazmak isterim . Harika olan, bu dizilerde ve dizelerde hem de çalışır:

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

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

Dizeler için ES6 / ES2015 ile başlayıp diziler için ES2016 için önerilen, bir kaynağın başka bir değer içerip içermediğini daha kolay belirleyebilirsiniz:

if (haystack.includes(needle)) {
    // do your thing
}

9
Tıpkı bir ES6 versiyonunu vermek düşündük contains: var contains = (a, b) => !!~a.indexOf(b)P:
Florrie

1
@ geon dezavantajlarını açıklayabilir misiniz?
Karl Taylor

1
@KarlTaylor Çok deyimsel değil. ES2017 kullanabiliyorsanız Array.prototype.includesbunun yerine kullanın.
geon

1
öğeleriyle IndexOf'u nasıl kullanabilirim?
ValRob

2
@ValRob no, ancak inbir nesnenin bir anahtarının (ör. 'property' in obj) Olup olmadığını görmek için kullanabilirsiniz veya bir nesnenin değerleri ile de döngü yapabilirsiniz Object.values(obj).forEach(value => {}).
Eli

95

Array.indexOf()Yöntem, birinci örneği değiştirecektir. Her örneği kullanmak için Array.map():

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

Tabii ki, bu yeni bir dizi oluşturur. Yerinde yapmak istiyorsanız, şunu kullanın Array.forEach():

a.forEach(function(item, i) { if (item == 3452) a[i] = 1010; });

7
Bunu okuyan herkes için. Hem map () hem de forEach (), Javascript spesifikasyonuna daha yeni eklemelerdir ve bazı eski tarayıcılarda mevcut değildir. Bunları kullanmak istiyorsanız, eski tarayıcılar için uyumluluk kodu eklemeniz gerekebilir: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
jfriend00

2
Array.indexOf()aynı zamanda tanıtıldı map()ve forEach(). IE8 veya daha eski sürümlerini destekliyorsanız ve destek eklemek için bir şim kullanmıyorsanız, mellamokb'un cevabına daha iyi gidin .
gilly3

array.map ayrıca ikinci parametrelerinde dizin döndürür a = a.map (işlev (öğe, anahtar) {if (item == 3452) a [anahtar] = 1010;});
Ricky sharma

38

Benim önerdiğim çözüm:

items.splice(1, 1, 1010);

Ekleme işlemi, dizideki (yani 3452) konum 1'den başlayarak 1 öğeyi kaldıracak ve yeni öğeyle değiştirecektir 1010.


6
İlk parametrenin 1, aslında ilk parametre işlemin dizinde gerçekleştiği anlamına geldiğinde öğenin kaldırılacağı anlamına geldiğinden yanıltıcıdır 1. developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…
InsOp


23

Bir fordöngü ile kolayca gerçekleştirilebilir .

for (var i = 0; i < items.length; i++)
    if (items[i] == 3452)
        items[i] = 1010;

9
Kolayca, ancak mutlaka verimli bir şekilde değil;)
Eli

7
@Eli: OP bir veya birden çok örneği değiştiriyorlarsa net değildi. Çözümüm birden çok örneği ele alıyor.
mellamokb

@Eli Bir şey varsa, bu tüm
olayları

15

Dizinleri kullanarak listenin herhangi bir sayısını düzenleyebilirsiniz

Örneğin :

items[0] = 5;
items[5] = 100;

11

Karmaşık bir nesne (hatta basit bir nesne) kullanıyorsanız ve es6'yı kullanabiliyorsanız, Array.prototype.findIndexiyi bir nesnedir . OP dizisi için,

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

Daha karmaşık nesneler için bu gerçekten parlıyor. Örneğin,

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

items[index].lastName = 'Utah'
items[index].firstName = 'Johnny'

6

Değiştirme bir satırda yapılabilir:

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

Veya yeniden kullanmak için bir işlev oluşturun:

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


6

ES6 yolu:

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

Çözüm 3452ile değiştirmek istiyoruz 1010:

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

Şüphesiz, soru yıllarca önce ve şimdilik sadece değişmez bir çözüm kullanmayı tercih ediyorum , kesinlikle harika ReactJS.

Sık kullanım için aşağıdaki fonksiyonu sunuyoruz:

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

4

İlk yöntem

Dizi öğesinin değiştirilmesi veya güncellenmesi için tek bir satırda en iyi yol

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

Örneğin:

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

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

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

İkinci yöntem

Aynı işlemi yapmanın diğer bir basit yolu:

items[items.indexOf(oldValue)] = newValue

3

En kolay yol, undercorejs ve map yöntemi gibi bazı kütüphaneleri kullanmaktır .

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

_.map(items, function(num) {
  return (num == 3452) ? 1010 : num; 
});
=> [523, 1010, 334, 31, ...5346]

2
Bir tür dilek lodash / alt çizgi replaceşimdi bir dizi farkında ..._.replace([1, 2, 3], 2, 3);
Droogans

3

ES6 spread operatörleri ve .sliceyöntemini kullanarak listedeki öğeyi değiştirmenin değişmez yolu .

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

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

Çalıştığını doğrulayın

console.log(arr)     // [ 'fir', 'next', 'third' ]
console.log(nextArr) // ['fir', 'second', 'third']

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

Değeri biliyorsanız, kullanın,

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

Değerin mevcut olup olmadığını bilmek istiyorsanız,

var point = items.indexOf(334);

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

Yeri (konumu) biliyorsanız, doğrudan kullanın,

items[--position] = 1010;

Birkaç öğeyi değiştirmek istiyorsanız ve yalnızca başlangıç ​​konumunun anlamına geldiğini biliyorsanız,

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

.splice hakkında daha fazla bilgi için


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

Buradan belirli bir değeri diziden silebilirsiniz ve aynı dizine dayanarak diziye değer ekleyebilirsiniz.

 Array.splice(index, 0, Array value);

1

Herkes bir dizindeki bir nesneyi dizininden nasıl değiştireceğine müdahale ederse, işte bir çözüm.

Nesnenin dizinini kimliğiyle bulun:

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

Nesneyi Object.assign () yöntemini kullanarak değiştirin:

Object.assign(items[index], newValue)

1

@ Gilly3 tarafından verilen yanıt harika.

Bunu nesne dizisi için genişletme

Sunucudan veri aldığımda yeni güncellenmiş kaydı kayıt dizime güncellemek için aşağıdaki yolu tercih ederim. Siparişi sağlam ve bir astarı oldukça düz tutar.

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


0

İlk olarak dizinizi şu şekilde yeniden yazın:

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

Ardından, dizideki öğeye dizin numarası aracılığıyla erişin. Dizin numarasını belirleme formülü:n-1

Dizideki ilk öğeyi değiştirmek için şunu (n=1)yazın:

items[0] = Enter Your New Number;

Örneğinizde, sayı 3452ikinci konumdadır (n=2). Yani indeks numarasını belirlemek için formül 2-1 = 1. Yani değiştirmek için aşağıdaki kodu yazmak 3452ile 1010:

items[1] = 1010;

0

Yeniden kullanılabilir bir işleve verilen temel cevap:

function arrayFindReplace(array, findValue, replaceValue){
    while(array.indexOf(findValue) !== -1){
        let index = array.indexOf(findValue);
        array[index] = replaceValue;
    }
}

1
dizine izin ver; while ((index = indexOf (findValue))! == -1) çift indexOf'u (findValue) önlemek için
Juan R

0

Döngüler için kullanarak ve orijinal dizi üzerinden yineleme ve başka bir diziye eşleşen arreas konumlarını ekleyerek ve daha sonra bu dizi döngü ve orijinal dizi değiştirerek sonra geri dönün, kullandım ve ok işlevi ama normal bir işlev bu sorunu çözdü çok işe yarar.

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

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.

0

En kolay yol budur.

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]

0 dizininde bulunan öğeler için replaceWhat = 523, replaceWith = 999999çalışmıyor Doğru sonuçlar vermiyor
Anthony Chung

0

İşte bir astar. Öğenin dizide olacağını varsayar.

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


0

Basit bir şeker sintaks oneliner istiyorsanız sadece şunları yapabilirsiniz:

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

Sevmek:

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

Kimliğiniz yoksa, öğeyi şu şekilde dizeleyebilirsiniz:

(elements = elements.filter(element => JSON.stringify(element) !== JSON.stringify(updatedElement))).push(updatedElement);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.