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?
replace
método para Arrays?
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?
replace
método para Arrays?
Respostas:
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 -1
comparação:
var index = items.indexOf(3452);
if (~index) {
items[index] = 1010;
}
Às vezes, até gosto de escrever uma contains
funçã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
}
contains
: var contains = (a, b) => !!~a.indexOf(b)
: P
Array.prototype.includes
.
in
para 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 => {})
.
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; });
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 .
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
.
1
item 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/…
Use indexOf para encontrar um elemento.
var i = items.indexOf(3452);
items[i] = 1010;
Facilmente realizado com um for
loop.
for (var i = 0; i < items.length; i++)
if (items[i] == 3452)
items[i] = 1010;
Você pode editar qualquer número da lista usando índices
por exemplo :
items[0] = 5;
items[5] = 100;
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'
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);
ES6 maneira:
const items = Array(523, 3452, 334, 31, ...5346);
Queremos substituir 3452
por 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);
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']
Uma outra maneira simples de fazer a mesma operação é:
items[items.indexOf(oldValue)] = newValue
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]
replace
agora ..._.replace([1, 2, 3], 2, 3);
A maneira imutável de substituir o elemento na lista usando operadores e .slice
mé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']
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
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);
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)
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);
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 3452
está 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 3452
com 1010
:
items[1] = 1010;
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;
}
}
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;
};
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.
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]
replaceWhat = 523, replaceWith = 999999
não produz resultados corretos
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))
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);