针对数组对象中有相同属性并且对应的属性值相等时进行累加操作 否则返回0

文章讲述了如何处理具有相同属性值的数组对象,通过检查对象的指定属性并进行累加操作。当所有对象的属性值相同时,累加`num`属性;否则返回0。文中提供了实现此功能的JavaScript函数示例,并通过多个例子展示了函数的工作原理。
摘要由CSDN通过智能技术生成

问题描述:关于对数组对象中具有相同属性并且属性值相同的处理!

举例:

const arr = [
{
	uname:'zhangsan',
	num:7
},
{
	uname:'lisi',
	num:9
},
{
	uname:'zhangsan',
	num:6
},
{
	uname:'zhangsan',
	num:11
},
]
const arr1 = [
{
	uname:'zhangsan',
	num:7
},
{
	uname:'zhangsan',
	num:9
},
{
	uname:'zhangsan',
	num:6
},
{
	uname:'zhangsan',
	num:11
},
]
const arr2 = [
{
	num:7
},
{
	uname:'zhangsan',
	num:9
},
{
	uname:'zhangsan',
	num:6
},
{
	uname:'zhangsan',
	num:11
},
]
// 比如说这个arr数组的对象里面都有uname属性并且值都相同就进行num的累加
// 如果属性值不相同的话就返回0  
// arr  返回 0  有一个uname的属性值为lisi 和其他属性值不相同
// arr1 返回 33 都有uname属性并且属性值都是zhangsan
// arr2 返回 0  有一条对象中没有uname属性

当然需求不同,有不同处理,该文章仅对作者所说需求进行处理!!!
实现思路有很多,希望各位大佬不要杠,这些是给一些小白提供思路,好人一生平安!

     // 需求:如果一个数组 里面有若干条对象,指定对象的某一个属性,如果这些对象都有这个属性并且对应的属性值还相同时,就累加这条对象的num值
    // 但凡没有这个属性或者有这个属性(但凡只要一个属性值不相等时)都返回 0

    // 数组series里面对象有 stack属性 但是值各不相同
    const series = [{
      uname: 'jgg',
      stack: 'hehe',
      num: 90
    }, {
      uname: 'dgg',
      stack: 'haha',
      num: 80 
    }, {
      uname: 'xgg',
      stack: 'xixi',
      num: 70
    }]
    //  数组series1里面对象 都有stack属性并且值都是相同的
    const series1 = [{
      uname: 'jgg',
      stack: 'haha',
      num: 90
    }, {
      uname: 'dgg',
      stack: 'haha',
      num: 80
    }, {
      uname: 'xgg',
      stack: 'haha',
      num: 70
    }]
    // 数组series2 里面对象有stack属性 但是其中一个属性值与其他的不相同
    const series2 = [{
      uname: 'jgg',
      stack: 'heha',
      num: 90
    }, {
      uname: 'dgg',
      stack: 'haha',
      num: 80
    }, {
      uname: 'xgg',
      stack: 'haha',
      num: 70
    }]
    //  数组series3 里面对象压根就没有 stack属性
    const series3 = [{
      uname: 'jgg',
      // stack: 'heha',
      num: 90
    }, {
      uname: 'dgg',
      // stack: 'haha',
      num: 80
    }, {
      uname: 'xgg',
      // stack: 'haha',
      num: 70
    }]
    // 数组series4 里面对象有stack属性 但是属性值不相同 并且有一条对象还没有stack属性
    const series4 = [{
      uname: 'jgg',
      stack: 'haha',
      num: 90
    }, {
      uname: 'dgg',
      stack: 'hehe',
      num: 80
    }, {
      uname: 'xgg',
      // stack: 'haha',
      num: 70 
    }]

    // 封装这样一个专门用来检测数组的对象的函数 返回最终num的累加值  如果数组对象里面有stack属性 并且属性值相等 就把对所有的num值累加  否则的话就num累加值直接赋值为 0
    function fn(arr) {
      // 声明total 最终要不return累加值 要不return 0
      let total = 0
      // 声明一个新的数组 用来接收对象属性的值
      // let newArr = []
      // 遍历arr数组 拿到每一条对象stack的值 
      // for (const item of arr) {
      //   // console.log(item)
      //   // 如果对象有stack属性 就追加到新数组里面
      //   if (item.stack) newArr.push(item.stack)

      // }
      // 当然也可以map数组 把满足条件的拿出来推送到newArr数组里面去 满足条件的话此时newArr里面就是存放着对应的stack的属性值
      const newArr = arr.map(function (ele, i) {
        // console.log(ele.stack)
        if (ele.stack) return ele.stack
        return []
      })
      // 如果说newArr的长度 === arr的长度  就表示arr数组里面的每一条对象都有stack属性 但是注意有可能newArr是[[],[],[]]存在
      const re = (newArr.length === arr.length) && newArr.every(function (ele, i) {
        // newArr  every一下就是看newArr数组的每一项的值是否相等 如果都相等的话 就进行下面的累加操作  
        // 只要有任意一项不相同的话就不累加  
        // 注意 []===[] 返回的是false 因为数组是复杂数据类型 所以比较的时候去比较的地址是否相同
        return ele === newArr[0]
      })

      // 如果上述操作返回的结果是true表示 newArr里面的每一项都相同
      if (re) {
        // 这里就是进行累加操作
        //  直接遍历arr数组 把里面的每一条对象的num拿出来累加 
              total = arr.reduce(function (pre, cur) {
          return pre + cur.num
        }, 0)
        return total
      }
        //这个reduce看不懂 可以用最基础的for循环也可以实现
        /*
         for (let i = 0; i < arr.length; i++) {
          total += arr[i].num
        }
        */
      //  如果上述操作的结果是false 就直接把total丢出去
      return total
    }


    const re = fn(series) // // 数组series里面对象 stack属性 但是值各不相同  对应输出的结果应该是0
    const re1 = fn(series1) //  数组series1 里面对象是有stack属性 并且值都是相同的  对应输出的结果应该是累加值 240
    const re2 = fn(series2) // 数组series2 里面对象有stack属性 但是其中一个属性值与其他的不相同 对应输出结果是0
    const re3 = fn(series3) //  数组series3 里面对象压根就没有 stack属性 对应输出结果是0
    const re4 = fn(series4)  // 数组series4 里面对象有stack属性 但是属性值不相同 并且有一条对象还没有stack属性 对应输出结果为0

    console.log(re)   // 0
    console.log(re1)  //240 
    console.log(re2)  //0
    console.log(re3)  // 0
    console.log(re4)  // 0
   /* 注意[[],[],[]].every(function(item,i){
    return item===[[],[],[]][0]
    }) 返回的结果是false */
    console.log([] === [], '数组是复杂数据类型,比较的是存放的地址')

// 最终结果 只有我们series1数组满足 有stack属性并且属性值都相同 返回累加值
// 其余都为0
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值