问题描述:关于对数组对象中具有相同属性并且属性值相同的处理!
举例:
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