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

时间:2018-12-06 07:13:00

标签: javascript arrays

我有一个数组:

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 个答案:

答案 0 :(得分:4)

您可以结合使用Array.reduceArray.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)

答案 1 :(得分:0)

您可以遍历数组并填充一个对象(在此处用作哈希图)。

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

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)

答案 2 :(得分:0)

您可以使用单个Array.reduceObject.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))

答案 3 :(得分:-1)

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)