js往原数组中添加新对象,相同就指定值+1,不相同就直接加进去

var param = [
    {
        id: 227901,
        goodsName: '苏泊尔石锅',
        goodsUnitName: '件',
        quantity: 1,
    },
    {
        id: 227900,
        goodsName: '宜家小推车',
        goodsUnitName: '件',
        quantity: 1,
    }
]

var a = [
    {
        id: 228196,
        goodsName: '笔筒',
        goodsUnitName: '个',
        quantity: 1,
    }
]

param是原有数组,a为新数组,往param中添加a,如果param中没有a就新增进去,如果有,quantity+1

阅读 3.6k
3 个回答
const merge = (s1, s2) => {
  const map = new Map()
   
  for(let i = 0; i < s1.length; ++i) {
    map.set(s1[i].id, s1[i])
  }

  for(let i = 0; i < s2.length; ++i) {
    if(map.has(s2[i].id)) map.get(s2[i].id).quantity++
    else map.set(s2[i].id, s2[i])
  }

  return Array.from(map.values())
}
function merge(target, source) {
    const targetIds = target.reduce((res,v) => res.add(v.id),new Set());
    const sourceIds = source.reduce((res,v) => res.add(v.id),new Set());
    target.forEach(v => sourceIds.has(v.id) && v.quantity++)
    return target.push(...source.filter(v => !targetIds.has(v.id)))
}
merge(param, a)

两个问题觉得需要注意

  1. id建议使用字符串,而不是直接位整数,这样防止过长的数字串在一些处理中被转换,造成bug
  2. 对于已有的建议是增加quantity数量为a中对应的,而不是简单加1.

    const merge = (s1, s2) => {
      const map = new Map()
    
      for(let i = 0; i < s1.length; ++i) {
     map.set(s1[i].id, s1[i])
      }
    
      for(let i = 0; i < s2.length; ++i) {
     if(map.has(s2[i].id)) map.get(s2[i].id).quantity=map.get(s2[i].id).quantity + s2[i].quantity
     else map.set(s2[i].id, s2[i])
      }
    
      return Array.from(map.values())
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题