js数组去重,id相同对某值相加合并

Posted 铁锤妹妹@

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js数组去重,id相同对某值相加合并相关的知识,希望对你有一定的参考价值。

案例1:

假设需要处理的数组结构。

 let arr =[
   id:'1', value:10,
   id:'1', value:20,
   id:'2', value:10
 ]

//最终想要的数组结构,相同的id,把value值相加
//  let newArr=[
//  id:'1',value:30,
//  id:'2',value:20,
//  ]

实现方式很简单,记录下来方便以后回顾

let idArr = []  //相同id放在同一数组中
let resultArr = []  //最终结果数组

for(let i = 0;i < arr.length; i++)
  let index = idArr.indexOf(arr[i].id)
  if(index > -1)  //有相同id存在的话,获取index索引位置
    resultArr[index].value += arr[i].value  //取相同id的value累加
  else
    idArr.push(arr[i].id)
    resultArr.push(arr[i])
  

打印结果

如果项目中处理这种数据多的话,我们可以封装成一个方法传入数组即可。

 import  delSomeObjValue  from '@/utils/tool.ts'
 const originArr = [
     id: '1', value: 10 ,
     id: '1', value: 20 ,
     id: '2', value: 10 ,
     id: '88', value: 2 ,
     id: '88', value: 5 ,
     id: '20', value: 50 
  ]
  
 console.log(delSomeObjValue(originArr, 'id', 'value'))
//tool.ts
 /*
  arr 需要处理的数组
  keyName 用于判断相同的键名
  keyValue 用于计算的键值
  */
export function delSomeObjValue(arr:any[], keyName:string, valueName:string) 
  const idArr:any[] = []  // 相同的id放在同一数组中
  const resultArr:any[] = [] // 最终结果数组
  for (let i = 0; i < arr.length; i++) 
    const index = idArr.indexOf(arr[i][keyName])
    if (index > -1)  // 有相同id存在的话,获取index索引位置
      resultArr[index][valueName] += arr[i][valueName]  //取相同id的value累加
     else 
      idArr.push(arr[i][keyName])
      console.log(idArr) // 打印结果['1', '2', '88', '20']
      resultArr.push(arr[i])
    
  
  return resultArr

案例2:

这是网上的例子,觉得思路很不错,拿来练习的。
假设需要处理的数组结构。

const originData = [
     name: 'tony', id: '1', age: '20' ,
     name: 'jack', id: '2', age: '21' ,
     name: 'tony', id: '3', age: '50' ,
     name: 'jack', id: '4', age: '10' ,
     name: 'mark', id: '5', age: '22' ,
     name: 'mark', id: '6', age: '40' 
  ]
  
// 最终想要的数组结构
// name相同的项,合并成一个数组对象
//const afterData = [
   //name: "tony",origin: [ name: "tony", id: "1", age: "20" , name: "tony", id: "3", age: "50" ],
   //name: "jack",origin: [ name: "jack", id: "2", age: "21" , name: "jack", id: "4", age: "10" ],
  // name: "mark",origin: [ name: "mark", id: "5", age: "22" , name: "mark", id: "6", age: "40" ]
// ]

合并实现代码:

onMounted(() => 
  const originData = [
     name: 'tony', id: '1', age: '20' ,
     name: 'jack', id: '2', age: '21' ,
     name: 'tony', id: '3', age: '50' ,
     name: 'jack', id: '4', age: '10' ,
     name: 'mark', id: '5', age: '22' ,
     name: 'mark', id: '6', age: '40' 
  ]

  const nameArr = []  //存放name,用来查找是否有相同name的情况
  const resultData = []  //合并结果数组

  for (let i = 0; i < originData.length; i++) 
    if (nameArr.indexOf(originData[i].name) === -1)  // 没找到相同name的话
      resultData.push(
        name: originData[i].name,
        origin: [originData[i]]
      )
      nameArr.push(originData[i].name)
     else  // 有相同name合并对象
      for (let j = 0; j < resultData.length; j++) 
        if (resultData[j].name === originData[i].name) 
          resultData[j].origin.push(originData[i])
          break
        
      
    
  
  console.log(resultData, 'console.log(resultData)')
)

打印结果:

之前也写过类似合并重组数组的文章,vue把多种类型的数据进行合并,相同类型的数据相加

以上是关于js数组去重,id相同对某值相加合并的主要内容,如果未能解决你的问题,请参考以下文章

php如何将数组中id相同数据的value相加之后得到新的数组

斐波那契数列数组去重数组合并旋转数组数组与某一值相加

js数组对象的相同值相加合并

js数组对象的相同值相加合并

vue把多种类型的数据进行合并,相同类型的数据相加

将数组内相同值的对象合并为一个新对象,并将其中一个值相加到新对象中,而且重复的对象则不能加到新对象