js for循环push新数组的key值相同问题.

const data = [{ a: '123', b: 'qwe', c: 'abc' },
              { a: '123', b: 'nwe', c: 'bac' },
              { a: '123', b: 'abr', c: 'bnm' },
              { a: '333', b: 'hhh', c: 'rrr' },
              { a: '333', b: 'vvv', c: 'rrr' },
              { a: '444', b: 'yyy', c: 'eee' }]

现在我需要的效果是,a对应新data的name,b对应新data的age,c对应新data的food,关键是如果有重复的a值就在多出的第一个加上'(1)',重复第二个就加'(2)',以此类推,如果没有重复则不动

理想效果↓

         const data = [{ name: '123', age: 'qwe', food: 'abc' },
                      { name: '123(1)', age: 'nwe', food: 'bac' },
                      { name: '123(2)', age: 'abr', food: 'bnm' },
                      { name: '333(1)', age: 'hhh', food: 'rrr' },
                      { name: '333(2)', age: 'vvv', food: 'rrr' },
                      { name: '444', age: 'yyy', food: 'eee' }]

我该怎么操作才能达到效果呢~..

感谢各位大神大哥的指导,先感谢你们的回答,小弟感激不尽,还请轻喷!

阅读 3.5k
4 个回答

image

console.log(demo(data))

function demo (list) {
  let name, map = {}
  return data.reduce(function (group, item) {
    map[item.a] = map[item.a] == null ? 0 : map[item.a] + 1
    name = map[item.a] ? item.a + '('+ map[item.a] +')' : item.a
    group.push({
      name: name,
      age: item.b,
      food: item.c
    })
    return group
  }, [])
}

用一个 map 计数,遍历原数据的时候,根据计数决定要不要给 a 加后缀就行了。

let names = new Map()
let newData = data.map(({a,b:age,c:food})=>{
    let n = names.get(a)
    let name = a + (n ? `(${n++})` : ''); 
    names.set(a,n || 1)
    return {name,age,food}
})
console.log(newData)
不考虑原数组中name本来存在 '111(1)' 这种值就可以这么简单转一下

你可以使用一个对象来记录每个 a 值出现的次数,然后根据这个计数来修改重复的 a 值。以下是一个实现该功能的 JavaScript 代码示例:

const data = [
  { a: '123', b: 'qwe', c: 'abc' },
  { a: '123', b: 'nwe', c: 'bac' },
  { a: '123', b: 'abr', c: 'bnm' },
  { a: '333', b: 'hhh', c: 'rrr' },
  { a: '333', b: 'vvv', c: 'rrr' },
  { a: '444', b: 'yyy', c: 'eee' }
];

const countMap = {};
const newData = [];

data.forEach(item => {
  const { a, b, c } = item;

  if (!countMap[a]) {
    countMap[a] = 0;
  }

  countMap[a]++;

  const name = countMap[a] > 1 ? `${a}(${countMap[a] - 1})` : a;

  newData.push({
    name: name,
    age: b,
    food: c
  });
});

console.log(newData);

解释:

  1. 我们首先定义一个空对象 countMap 来记录每个 a 值出现的次数,以及一个空数组 newData 来存储新的数据结构。
  2. 使用 forEach 遍历原始 data 数组。
  3. 对于每个元素,检查 countMap 中是否已经存在 a 值,如果不存在则初始化为 0。
  4. 每次遇到 a 值时,将其计数加 1。
  5. 根据计数结果生成新的 name,如果计数大于 1,则在 a 值后加上 (countMap[a] - 1),否则直接使用 a 值。
  6. 将新的对象 { name, age, food } 推入 newData 数组中。
  7. 最后打印 newData,可以看到已经得到了期望的结果。

运行上述代码,你将得到如下输出:

[
  { name: '123', age: 'qwe', food: 'abc' },
  { name: '123(1)', age: 'nwe', food: 'bac' },
  { name: '123(2)', age: 'abr', food: 'bnm' },
  { name: '333', age: 'hhh', food: 'rrr' },
  { name: '333(1)', age: 'vvv', food: 'rrr' },
  { name: '444', age: 'yyy', food: 'eee' }
]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题