代码之家  ›  专栏  ›  技术社区  ›  Abhi

如何连接具有相同ID的对象值

  •  1
  • Abhi  · 技术社区  · 6 年前

    我有一个数组:

    let ar = [
        {
             uid:1, 
             flat_no: 1
        },
        {
             uid:2,
             flat_no: 2
        },
        {
             uid:1,
             flat_no:3
        }
    ];
    

    如果 uid 相同,则我要删除重复项 UID 并连接其 flat_no .输出数组应如下所示:

    [
         {
             uid:1, 
             flat_no: [1,3]
         },
         {
             uid:2,
             flat_no: 2
         }
    ];
    
    4 回复  |  直到 6 年前
        1
  •  4
  •   nicholaswmin    6 年前

    您可以使用 Array.reduce Array.find .

    如果在累加器数组中找到一个现有项,只需更新它 flat_no 属性,否则 push 它被发送到累加器数组。

    let arr = [
      {
         uid: 1,
         flat_no: 1
      },
      {
         uid: 2,
         flat_no: 2
      },
      {
         uid: 1,
         flat_no: 3
      }
    ]
    
    arr = arr.reduce((arr, item) => {
      const existing = arr.find(innerItem => innerItem.uid === item.uid)
    
      if (existing) {
        existing.flat_no = Array.isArray(existing.flat_no)
          ? existing.flat_no
          : [existing.flat_no]
    
        existing.flat_no.push(item.flat_no)
      } else {
        arr.push(item)
      }
    
      return arr
    }, [])
    
    console.log(arr)
        2
  •  0
  •   Eponyme Web    6 年前

    您可以迭代数组并填充一个对象(这里用作哈希图)。

    完成后,提取值以获得结果。

    let hashResult = {}
    ar.forEach(element => {
        if (hashResult[element.uid] == undefined) {
            hashResult[element.uid] = { uid: element.uid, flat_no: [] }
        }
        hashResult[element.uid].flat_no.push(element.flat_no)
    })
    
    let result = Object.values(hashResult)
    console.log(new Date(), result)
    
        3
  •  0
  •   Akrion    6 年前

    你可以用一个简单的方法 Array.reduce Object.values 要匹配所需的输出:

    let data = [ { uid:1, flat_no: 1 }, { uid:2, flat_no: 2 }, { uid:1, flat_no:3 } ];
    
    const result = data.reduce((r, {uid, flat_no}) => {
      r[uid] ? r[uid].flat_no = [r[uid].flat_no, flat_no] : r[uid] = {uid, flat_no}
      return r
    }, {})
    
    console.log(Object.values(result))
        4
  •  -1
  •   anuragb26    6 年前

    1)将初始数组缩小为以uid为键,以flat_no为值的对象。

    2)然后在键上运行一个映射,将其转换为一组带有uid和flat_no的对象。

    1)第一步代码

    let ar = [{uid:1, flat_no: 1},{uid:2, flat_no: 2},{uid:1, flat_no:3}];
    let outputObj = ar.reduce((outputObj,currObj,currIndex) => {
      let {uid,flat_no} = currObj
      if (outputObj[uid]) {
        outputObj[uid].push(flat_no)
      }
      else {
       outputObj[uid] = [flat_no]
      }
      return outputObj
    },{})
    

    2)

    let finalOutput = Object.keys(outputObj).map(key => 
      ({uid:key,flat_no:outputObj[key]}))
    console.log(finalOutput)