Обновить элемент во вложенном массиве, неизменяемый - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь обновить цену на BMW 730d следующим json.

Объект cars должен быть новым объектом (неизменяемым), поэтому мне нужно использовать функцию карты.

И я не хочу использовать такие библиотеки, как immutable или normalizr.Цель состоит в том, чтобы разобраться с функцией карты, но я застрял, оценивая название бренда.

const cars =
[
    {
        brand: 'BMW',
        model: [
            {
                name: '535d',
                price: 35000
            }, {
                name: '730d',
                price: 55000
            }
        ]
    },
    {
        brand: 'Mercedes',
        model: [
            {
                name: 'roadstar',
                price: 75000
            },
        ]
    },
];

Это то, что у меня есть до сих пор:

// trying to update the price of a BMW 730d

const newCars= cars.map(brand => {
    console.log(brand);
    // and now ?

});

Но сейчасЯ застрял.

Кто мне поможет?

Спасибо!

[РЕДАКТИРОВАТЬ] Я добавил идентификатор "бренда" в JSON для идентификации моделей.

Ответы [ 3 ]

0 голосов
/ 03 июня 2018

Вы должны проверить свойство объекта, вы можете использовать метод hasOwnProperty объекта, чтобы узнать, имеет ли объект x свойство y или нет, в вашем случае вы должны выполнить следующий тест:

If(brand.hasOwnProperty('BMW')) {
  // To do 
}
0 голосов
/ 04 июня 2018

Вы бы проверили, относится ли текущий объект к BMW, и вернули для него новый объект (с требуемым списком новой модели), или просто вернули бы неизмененный объект в противном случае:

const newCars = cars.map(car => {
    if (car.brand == "BMW") {
        return {
            brand: "BMW",
            model: car.model.map(model => {
                // …
            }),
        };
    } else {
        return car;
    }
});

Для обновления соответствующегообъект в массиве model, используйте точно такой же подход снова.

0 голосов
/ 03 июня 2018

Технически, ваша формулировка неизменности неверна.Неизменность означает фундаментальную неспособность мутировать.В вашем случае вы просто принимаете решение не мутировать.

К сожалению, исходя из структуры ваших данных, вам придется немного запутаться, чтобы извлечь ключ.Object.keys - это лучший способ, о котором я могу думать.Он возвращает массив, поэтому вы должны ввести индекс 0.

cars.map(car => {
  const brand = Object.keys(car)[0];
  if (brand === 'BMW') {
  }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...