Як замінити елемент у масиві на Javascript?


315

Кожен елемент цього масиву - це деяка кількість.

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

Як замінити деякий номер масиву на новий?

Наприклад, ми хочемо замінити 3452 на 1010, як би ми це зробили?


5
Чи є кілька випадків 3452, які потрібно змінити, або лише один?
mellamokb

53
Буде один екземпляр, якщо темні сили не додадуть ще одного.
Джеймс

2
Коли відбувається заміна рядків, чому не існує replaceметоду для масивів?
життєвий баланс

Відповіді:


464
var index = items.indexOf(3452);

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

Також рекомендується не використовувати метод конструктора для ініціалізації масивів. Замість цього використовуйте буквальний синтаксис:

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

Ви також можете скористатися ~оператором, якщо ви користуєтеся стислим JavaScript і хочете скоротити -1порівняння:

var index = items.indexOf(3452);

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

Іноді мені навіть подобається написати containsфункцію, щоб абстрагувати цю перевірку і полегшити розуміння того, що відбувається. Приємно, що це працює на масивах і рядках:

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

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

Починаючи з ES6 / ES2015 для рядків і пропонуючи для ES2016 для масивів, ви можете легше визначити, чи містить джерело інше значення:

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

9
Просто думав , що я дав би версію ES6 з contains: var contains = (a, b) => !!~a.indexOf(b): P
Флорі

1
@geon, чи можете ви поясніть недоліки?
Карл Тейлор

1
@KarlTaylor Це просто не дуже ідіоматично. Якщо ви можете використовувати ES2017, використовуйте Array.prototype.includesзамість цього.
геон

1
чи можу я використовувати IndexOf з елементами об’єкта?
ValRob

2
@ValRob ні, але ви можете використовувати, inщоб побачити, чи є в об’єкта ключ (наприклад, 'property' in obj), або ви також можете перевести циклічні значення на об'єкт за допомогою Object.values(obj).forEach(value => {}).
Елі

95

Array.indexOf()Метод замінює перший екземпляр. Щоб використовувати кожен екземпляр Array.map():

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

Звичайно, це створює новий масив. Якщо ви хочете зробити це на місці, використовуйте Array.forEach():

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

7
Для всіх, хто читає це. І map (), і forEach () - новіші доповнення до специфікації Javascript і відсутні в деяких старих браузерах. Якщо ви хочете їх використовувати, можливо, вам доведеться додати код сумісності для старих браузерів: developer.mozilla.org/uk/JavaScript/Reference/Global_Objects/…
jfriend00

2
Array.indexOf()було введено одночасно з map()і forEach(). Якщо ви підтримуєте IE8 або новішу версію , і ви не використовуєте shim для додавання підтримки, краще перейдіть з відповіддю mellamokb .
gilly3

array.map також повертає індекс у своєму другому параметрі a = a.map (функція (елемент, ключ) {if (item == 3452) a [key] = 1010;});
Рікі шарма

38

Моїм запропонованим рішенням було б:

items.splice(1, 1, 1010);

Операція сплайсингу видалить 1 елемент, починаючи з позиції 1 в масиві (тобто 3452), і замінить його новим 1010.


6
Це вводить в оману, оскільки ви зазначаєте, що перший параметр означає, що 1елемент буде видалений, коли фактично перший параметр означає, що операція відбувається в індексі 1. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
InsOp

28

Використовуйте indexOf для пошуку елемента.

var i = items.indexOf(3452);
items[i] = 1010;

1
що робити, якщо це не очікуваний елемент. якщо його знайде, він поверне індекс знайденого елемента, але якщо ні, то поверне -1. і буде встановлено це значення на -1. будь ласка, зверніться до jsbin.com/wugatuwora/edit?js,console
surekha shelake

23

Легко виконується за допомогою forпетлі.

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

9
Легко, але не обов'язково ефективно;)
Ілій

7
@Eli: OP не було зрозуміло, замінювали вони один примірник чи кілька екземплярів. Моє рішення обробляє кілька примірників.
mellamokb

@Eli Якщо що, це була б найефективніша відповідь, розміщена для заміни всіх
випадків

14

Ви можете редагувати будь-яку кількість списку, використовуючи індекси

наприклад :

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

11

Якщо ви використовуєте складний об'єкт (або навіть простий), і ви можете використовувати es6, Array.prototype.findIndexце хороший. Для масиву ОП вони могли б зробити,

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

Для більш складних об'єктів це справді світить. Наприклад,

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

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

6

Заміна може бути виконана в один рядок:

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

Або створіть функцію для повторного використання:

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 спосіб:

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

Ми хочемо замінити 3452з 1010, рішенням:

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

Звичайно, питання вже багато років тому, і зараз я просто вважаю за краще використовувати незмінне рішення, безумовно, це приголомшливо дляReactJS .

Для частого використання я пропоную нижче функцію:

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

4

Перший метод

Найкращий спосіб лише за один рядок замінити або оновити елемент масиву

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

Наприклад:

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

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

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

Другий метод

Ще один простий спосіб виконати ту саму операцію:

items[items.indexOf(oldValue)] = newValue

3

Найпростішим способом є використання деяких бібліотек, таких як підкреслення та метод карт.

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

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

2
Вид бажань подання / підкреслення забезпечив масив усвідомлений replaceзараз ..._.replace([1, 2, 3], 2, 3);
Droogans

3

Незмінний спосіб замінити елемент у списку за допомогою операторів та .sliceметоду розповсюдження ES6 .

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

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

Перевірте, чи працює

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

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

Якщо ви знаєте значення, тоді використовуйте,

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

Якщо ви хочете знати, що значення є чи ні, скористайтеся,

var point = items.indexOf(334);

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

Якщо ви знаєте місце (положення), тоді безпосередньо використовуйте,

items[--position] = 1010;

Якщо ви хочете замінити кілька елементів, і ви знаєте, що тільки вихідне положення означає,

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

докладніше про .splice


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

звідси ви можете видалити певне значення з масиву і на основі того ж індексу ви можете вставити значення в масив.

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

1

Добре, якщо комусь цікаво, як замінити об’єкт з його індексу на масив, ось рішення.

Знайдіть індекс об’єкта за його ідентифікатором:

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

Замініть об'єкт методом Object.assign ():

Object.assign(items[index], newValue)

1

Відповідь від @ gilly3 чудова.

Як розширити це для масиву об’єктів

Я віддаю перевагу наступному способу оновлення нової оновленої записи в моєму масиві записів, коли я отримую дані з сервера. Він зберігає порядок неушкодженим і досить прямим вперед одним лайнером.

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

Спочатку перепишіть свій масив так:

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

Далі, отримайте доступ до елемента в масиві через його індексний номер. Формула для визначення індексного числа:n-1

Щоб замінити перший елемент (n=1)у масиві, напишіть:

items[0] = Enter Your New Number;

У вашому прикладі число 3452знаходиться на другій позиції (n=2). Тож формула для визначення числа індексу є 2-1 = 1. Так написати наступний код , щоб замінити 3452з 1010:

items[1] = 1010;

0

Ось основна відповідь, виконана у функції багаторазового використання:

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

1
нехай індекс; while ((index = indexOf (findValue))! == -1), щоб уникнути подвійного indexOf (findValue)
Juan R

0

Я вирішив цю проблему за допомогою циклів та ітерації через оригінальний масив і додав позиції відповідних масивів до іншого масиву, а потім прокрутив цей масив і змінив його в початковому масиві, потім поверніть його, я використав і функцію стрілки, але регулярну функцію працював би теж.

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

Найпростіший спосіб - це.

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 replaceWhat = 523, replaceWith = 999999 , не дає правильних результатів
Ентоні Чанг

0

Ось один лайнер. Він передбачає, що елемент буде в масиві.

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

Якщо ви хочете простого синтаксису для одинарного цукру, ви можете просто:

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

Подібно до:

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

Якщо у вас немає ідентифікатора, ви можете впорядкувати елемент на зразок:

(elements = elements.filter(element => JSON.stringify(element) !== JSON.stringify(updatedElement))).push(updatedElement);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.