Como substituir um item em uma matriz por Javascript?

315

Cada item dessa matriz é algum número.

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

Como substituo um número por array por um novo?

Por exemplo, queremos substituir 3452 por 1010, como faríamos isso?

James
fonte
5
Existem várias instâncias do 3452 que precisam ser alteradas ou apenas uma?
Mellamokb 6/05
53
Haverá uma instância, se as forças das trevas não adicionarem mais uma.
James
2
Quando há substituição de string, por que não existe um replacemétodo para Arrays?
lifebalance

Respostas:

464
var index = items.indexOf(3452);

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

Também é recomendável que você não use o método construtor para inicializar suas matrizes. Em vez disso, use a sintaxe literal:

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

Você também pode usar o ~operador se estiver no JavaScript conciso e quiser diminuir a -1comparação:

var index = items.indexOf(3452);

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

Às vezes, até gosto de escrever uma containsfunção para abstrair essa verificação e facilitar a compreensão do que está acontecendo. O mais impressionante é que isso funciona tanto em matrizes quanto em strings:

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

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

Começando com o ES6 / ES2015 para seqüências de caracteres e proposto para o ES2016 para matrizes, é possível determinar com mais facilidade se uma fonte contém outro valor:

if (haystack.includes(needle)) {
    // do your thing
}
Eli
fonte
9
Apenas pensei em dar uma versão ES6 de contains: var contains = (a, b) => !!~a.indexOf(b): P
Florrie
1
@geon você pode explicar as desvantagens?
Karl Taylor
1
@KarlTaylor Não é apenas muito idiomático. Se você pode usar o ES2017, use Array.prototype.includes.
21818 Geon #
1
posso usar IndexOf com elementos de objeto?
ValRob 27/03/19
2
@ValRob no, mas você pode usar inpara ver se um objeto tem uma chave (por exemplo, 'property' in obj) ou também pode fazer um loop sobre os valores de um objeto com Object.values(obj).forEach(value => {}).
Eli Eli
95

O Array.indexOf()método substituirá a primeira instância. Para obter todas as instâncias, use Array.map():

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

Claro, isso cria uma nova matriz. Se você quiser fazer isso no lugar, use Array.forEach():

a.forEach(function(item, i) { if (item == 3452) a[i] = 1010; });
gilly3
fonte
7
Para mais alguém lendo isso. Map () e forEach () são adições mais recentes à especificação Javascript e não estão presentes em alguns navegadores mais antigos. Se você quiser usá-los, você pode ter que adicionar o código de compatibilidade para navegadores mais antigos: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...
jfriend00
2
Array.indexOf()foi introduzido ao mesmo tempo que map()e forEach(). Se você está suportando o IE8 ou anterior e não está usando um calço para adicionar suporte, é melhor ir com a resposta de mellamokb .
gilly3
array.map também retorna o índice em seu segundo parâmetro a = a.map (função (item, chave) {if (item == 3452) a [key] = 1010;});
Ricky sharma
38

Minha solução sugerida seria:

items.splice(1, 1, 1010);

A operação de emenda removerá 1 item, começando na posição 1 na matriz (ou seja 3452), e o substituirá pelo novo item 1010.

Shimon Agassi
fonte
6
Isso é enganoso, pois você indica que o primeiro parâmetro significa que o 1item será removido quando, na verdade, o primeiro parâmetro significa que a operação ocorre no índice 1. developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…
InsOp
28

Use indexOf para encontrar um elemento.

var i = items.indexOf(3452);
items[i] = 1010;
Tesserex
fonte
1
E se ele não espera elemento. se encontrado, retornará o índice do elemento encontrado, mas, se não, retornará -1. e vai definir esse valor como -1. consulte jsbin.com/wugatuwora/edit?js,console
Surekha shelake
23

Facilmente realizado com um forloop.

for (var i = 0; i < items.length; i++)
    if (items[i] == 3452)
        items[i] = 1010;
mellamokb
fonte
9
Facilmente, mas não necessariamente de forma eficiente;)
Eli
7
@ Eli: OP não estava claro se eles estavam substituindo uma instância ou várias instâncias. Minha solução lida com várias instâncias.
Mellamokb 6/05
@ Eli Se alguma coisa, essa seria a resposta mais eficiente publicada para substituir todas as ocorrências #
063 Tobiq
15

Você pode editar qualquer número da lista usando índices

por exemplo :

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

Se você estiver usando um objeto complexo (ou mesmo simples) e puder usar o es6, Array.prototype.findIndexé bom. Para a matriz do OP, eles poderiam fazer,

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

Para objetos mais complexos, isso realmente brilha. Por exemplo,

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

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

A substituição pode ser feita em uma linha:

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

Ou crie uma função para reutilizar:

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
fonte
6

ES6 maneira:

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

Queremos substituir 3452por 1010, solução:

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

Certamente, a questão é há muitos anos e, por enquanto, eu apenas prefiro usar uma solução imutável , definitivamente, é incrível paraReactJS .

Para uso frequente, ofereço a função abaixo:

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

Primeiro método

Melhor maneira em apenas uma linha para substituir ou atualizar o item da matriz

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

Por exemplo:

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

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

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

Segundo método

Uma outra maneira simples de fazer a mesma operação é:

items[items.indexOf(oldValue)] = newValue
Goms
fonte
3

A maneira mais fácil é usar algumas bibliotecas como underscorejs e map map.

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

_.map(items, function(num) {
  return (num == 3452) ? 1010 : num; 
});
=> [523, 1010, 334, 31, ...5346]
mrded
fonte
2
Tipo de desejo lodash / sublinhado forneceu uma matriz consciente replaceagora ..._.replace([1, 2, 3], 2, 3);
Droogans
3

A maneira imutável de substituir o elemento na lista usando operadores e .slicemétodo de propagação ES6 .

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

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

Verifique se funciona

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

Se você souber o valor, use,

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

Se você quiser saber se o valor está presente ou não, use,

var point = items.indexOf(334);

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

Se você conhece o local (posição), use diretamente,

items[--position] = 1010;

Se você deseja substituir alguns elementos e sabe apenas que a posição inicial significa apenas,

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

para saber mais sobre .splice

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

a partir daqui, você pode excluir um valor específico da matriz e, com base no mesmo índice, pode inserir valor na matriz.

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

Bem, se alguém está interessado em como substituir um objeto do seu índice em uma matriz, aqui está uma solução.

Encontre o índice do objeto pelo seu ID:

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

Substitua o objeto usando o método Object.assign ():

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

A resposta de @ gilly3 é ótima.

Como estender isso para a matriz de objetos

Prefiro a seguinte maneira de atualizar o novo registro atualizado em minha matriz de registros quando obtenho dados do servidor. Mantém a ordem intacta e bastante direta em um forro.

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
fonte
0

Primeiro, reescreva sua matriz assim:

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

Em seguida, acesse o elemento na matriz através do seu número de índice. A fórmula para determinar o número do índice é:n-1

Para substituir o primeiro item (n=1)da matriz, escreva:

items[0] = Enter Your New Number;

No seu exemplo, o número 3452está na segunda posição (n=2). Portanto, a fórmula para determinar o número do índice é 2-1 = 1. Então escreva o seguinte código para substituir 3452com 1010:

items[1] = 1010;
Anthony Levato
fonte
0

Aqui está a resposta básica transformada em uma função reutilizável:

function arrayFindReplace(array, findValue, replaceValue){
    while(array.indexOf(findValue) !== -1){
        let index = array.indexOf(findValue);
        array[index] = replaceValue;
    }
}
JohnP2
fonte
1
deixe índice; while ((Índice = indexOf (findValue)) == -1!) para evitar a dupla indexOf (findValue)
Juan R
0

Eu resolvi esse problema usando loops e iterando pela matriz original e adicionando as posições dos vincos correspondentes a outra matriz e, em seguida, percorrendo essa matriz e alterando-a na matriz original e retornando-a, usei a função de seta, mas uma função regular funcionaria também.

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
fonte
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
fonte
0

A maneira mais fácil é essa.

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
fonte
não funciona para itens encontrados no índice 0 replaceWhat = 523, replaceWith = 999999não produz resultados corretos
Anthony Chung
0

Aqui está um forro. Ele assume que o item estará na matriz.

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
fonte
0

Se você deseja um simples sintaxe para açúcar oneliner, basta:

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

Gostar:

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

Se você não tiver um ID, poderá especificar o elemento como:

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