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

#javascript #reactjs

#javascript #reactjs

Вопрос:

Я пытаюсь обновить определенное значение внутри объекта, который находится внутри массива объектов. Пример:

 [
    {
        id: 1,
        service: 1001,
        country: {
            id: 1,
            countryname: India
        },
        ts: 1597758281
    },
    {
        id: 2,
        service: 1002,
        country: {
            id: 2,
            countryname: USA
        },
        ts: 1597758283
    }
]
  

Теперь я хочу обновить значение идентификатора страны первого объекта, чтобы оно стало похоже:

 [
    {
        id: 1,
        service: 1001,
        country: {
            id: 2,
            countryname: USA
        },
        ts: 1597758281
    },
    {
        id: 2,
        service: 1002,
        country: {
            id: 2,
            countryname: USA
        },
        ts: 1597758283
    }
]
  

Это то, что я пробовал до сих пор, я получаю индекс элемента, который должен быть обновлен. Затем я создал копию исходного массива, а затем пытаюсь обновить значение. Но, похоже, это не работает.

 handleUpdate = (event, item) => {
        const elementsIndex = this.state.laneArray.findIndex(element => element.id == item.id);

        let newArray = [...this.state.laneArray]

        if (event.target.name === "countryName") {
            newArray[elementsIndex] = { ...newArray[elementsIndex], [newArray[0].country.id]: event.target.value }
        }

        this.setState({
            laneArray: newArray,
        });
    }
  

Я думаю, мне нужно обновить весь объект country. Как я мог это сделать?

Ответ №1:

Как только у вас будет индекс, разрежьте массив до и после этого индекса, а в середине задайте country свойству объект с новым идентификатором и с существующим countryname :

 const input = [
    {
        id: 1,
        service: 1001,
        country: {
            id: 1,
            countryname: 'India'
        },
        ts: 1597758281
    },
    {
        id: 2,
        service: 1002,
        country: {
            id: 2,
            countryname: 'USA'
        },
        ts: 1597758283
    }
];
const i = 0;
const newId = 2;

const output = [
  ...input.slice(0, i),
  {
    ...input[i],
    country: { id: newId, countryname: input[i].country.countryname }
  },
  ...input.slice(i   1),
];
console.log(output);  

Также имейте в виду, что для строковых литералов требуются разделители, такие как ' или " или обратные метки.