Карта массива в javascript изменяет все элементы в массиве - PullRequest
1 голос
/ 22 июня 2019

У меня есть вектор объектов в Javascript (React Native), и мне нужно добавить разные случайные ключи для каждого элемента массива. Проблема в том, что если я добавлю свойство ключа к одному объекту, он обновит один и тот же ключ для каждого элемента массива.

Я даже не знаю, в чем проблема.

Мой оригинальный массив:

[{"nome":"insalata di mare","prezzo":0.3,"qr_code":"qr_valore","quantita":3},{"nome":"insalata di mare","prezzo":0.3,"qr_code":"qr_valore","quantita":3}]

Результат, который я получаю, таков:

Lista prodotti randomico: [{"nome":"insalata di mare","prezzo":0.3,"qr_code":"qr_valore","quantita":3,"key":"x4idec"},{"nome":"insalata di mare","prezzo":0.3,"qr_code":"qr_valore","quantita":3,"key":"x4idec"}]

Проблема возникает только тогда, когда предмет «одинаковый».

componentWillMount(){

    this.props.productList.map(item => {
      item.key = Math.random().toString(36).substring(7)
    })

}

Ожидаемый результат - разные ключи для каждого объекта, например:

Lista prodotti randomico: [{"nome":"insalata di mare","prezzo":0.3,"qr_code":"qr_valore","quantita":3,"key":"x4idec"},{"nome":"insalata di mare","prezzo":0.3,"qr_code":"qr_valore","quantita":3,"key":"d2jdss"}]

Ответы [ 2 ]

2 голосов
/ 22 июня 2019

Вы уверены, что каждый элемент массива на самом деле является отдельным объектом?

Если вы делаете что-то вроде этого:

let a = {foo: 'bar'};
let b = a;
let array = [a, b];

array будет выглядеть так:

[{foo: 'bar'}, {foo: 'bar'}]

Если вы используете map, как показано выше, оба элемента действительно изменятся вместе, потому что каждый элемент массива - это один и тот же объект , просто один и тот же объект, встречающийся в нескольких индексах в массиве.

array.map((item, index) => item.key = index)

Результатом будет:

[{foo: 'bar', key: 1}, {foo: 'bar', key: 1}]

НЕ [{foo: 'bar', key: 0}, {foo: 'bar', key: 1}], как вы могли бы пожелать.

Чтобы убедиться, что каждый элемент массива изменяется независимо, вам необходимо убедиться, что каждый элемент является независимым объектом. Было бы полезно использовать что-то вроде функции lodash clone.

array.map((item, index) => _.clone(item).key = index)

0 голосов
/ 22 июня 2019

Исходя из того, что написал @kshetline.

Я полагаю, что это должно быть тем, что вы хотите без использования внешней библиотеки.

const products = this.props.productsList.map((product, key) => ({
  ...product,
  key
}));

Ключ, который мы здесь отбираем, заключается в том, чтобудет создан новый объект, однако если у вас есть ключевое свойство, оно будет переопределено!

Дайте мне знать, что вы думаете!

...