如果数组包含重复项,如何为数组中的每个元素赋予唯一的ID?

时间:2018-07-08 11:21:10

标签: javascript

我有一个包含8个对象的数组的JSON文件。

我需要将其变成具有16个对象的数组,其中每个对象重复两次,并为每个对象赋予一个单独的ID

我设法使这样的元素数量翻倍

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

然后我尝试像这样添加ids

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

我不确定为什么,但是所有重复项都具有相同的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
    });
  };

2 个答案:

答案 0 :(得分: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}]);
}, []);

答案 1 :(得分:0)

正如其他人提到的那样,如果您要更改相同的对象引用而不是创建新的对象引用,则会出现问题。

您还可以将ID分配也移动到reduce中:

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);