JavaScript /从0开始设置增量索引

时间:2020-06-12 09:12:04

标签: javascript arrays javascript-objects increment unique-index

我在设置始终唯一索引时增加一个问题。

我有一个像这样的数组。

const parentArr = [
  {
    name: 'first parent array',
    childArray: [
      {
        name: '1 / first child'
      },
      {
        name: '1 / second child'
      }
    ]
  },
    {
    name: 'second parent array',
    childArray: [
      {
        name: '2 / first child array'
      },
      {
        name: '2 / second child array'
      }
    ]
  }
]

我期望这样的结果:

const expectedResult = [
  {
    name: 'first parrent array',
    additionalInfo: [
      {
        index: 0,
        name: '1 - first child'
      },
      {
        index: 1,
        name: '1 - second child'
      }
    ]
  },
   {
    name: 'second parrent array',
    additionalInfo: [
      {
        index: 2,
        name: '2 -first child array'
      },
      {
        index: 3,
        name: '2- second child array'
      }
    ]
  }
]

我想在从0开始的每个项目的extraInfo内都有索引。

我这样尝试过,但是索引编号错误

  return parentArr.map((parent) => {
    return {
      name: parent.name,
      additionalData: parent.childArray.map((child, index) => ({
        name: child.name
        index: index   // I'M STUCK ON THIS LINE
      })),
    };
  });

2 个答案:

答案 0 :(得分:3)

您必须独立于循环来管理子级的索引。那呢?

let i = 0;

return parentArr.map((parent) => {
  return {
    name: parent.name,
    additionalData: parent.childArray.map((child) => ({
      name: child.name
      index: i++
    })),
  };
});

答案 1 :(得分:1)

索引计数应位于地图外部,因为它将在每次迭代时重置。

您可以将此行为抽象为可重用的方法,如下所示。

const parentArr = [
  {
    name: 'first parent array',
    childArray: [
      {
        name: '1 / first child'
      },
      {
        name: '1 / second child'
      }
    ]
  },
    {
    name: 'second parent array',
    childArray: [
      {
        name: '2 / first child array'
      },
      {
        name: '2 / second child array'
      }
    ]
  }
];


const transformArray = root => {
  let i = 0;
  return root.map(({ name, childArray }) => ({
    name,
    additionalData: childArray.map(({ name }) => ({
      index: i++,
      name
    }))
  }));
};

console.log(transformArray(parentArr));