Как передать каждому элементу в массив уникальный идентификатор, если массив состоит из дубликатов?

У меня есть файл JSON с массивом из 8 объектов.

Мне нужно превратить его в массив с 16 объектами, где каждый объект повторяется дважды и дает каждому из этих объектов indiv let d = data . уменьшить ( функция ( res , current ) { return res . concat ([ current , current ]); }, []); ual id

Мне удалось уменьшить количество элементов, подобных этому

ids

Затем я попытался добавить так:d.forEach((item, index) => { item.id = index; })

id

И я не уверен, почему, но все дубликаты получают одинаковые id

Структура объекта JSON

[
  {
    "name": "name",
    "description": "description"
  }
]

Код

export const fetchData = () => dispatch => {

    let d = data.reduce(function (res, current) {
        return res.concat([current, current]);
    }, []);

    d.forEach((item, index) => {
        item.id = index;
    });

    dispatch({
        type: FETCH_DATA,
        payload: d
    });
  };

javascript,

0

Ответов: 2


0

currentявляется ссылочным объектом, вам понадобится Object.assign({}, current)внутри вашего массива, чтобы убедиться, что вы получаете 2 копии исходного объекта, например:

let d = data.reduce(function (res, current) {
    return res.concat([Object.assign({}, current), Object.assign({}, current)]);
}, []);

Или с оператором распространения, так

let d = data.reduce(function (res, current) {
    return res.concat([{...current}, {...current}]);
}, []);

0

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

Вы также можете переместить присвоение идентификатора в сокращение:

const data = [
  {
    "name": "name",
    "description": "description"
  },
  {
    "name": "name2",
    "description": "description2"
  }
]


const d = data.reduce((res, current) => [
  ...res,
  {
    ...current,
    id: res.length
  },
  {
    ...current,
    id: res.length + 1
  }],
[]);


console.log(d);

JavaScript,
Похожие вопросы