首页 新闻 会员 周边 捐助

javascript Array.reduce()

0
悬赏园豆:10 [已解决问题] 解决于 2023-01-06 10:48

1. 数据结构

const arr = [{ 'time': new Date(0), 'content': 'aaaa', 'tag': 0 }, { 'time': new Date(0), 'content': 'bbb', 'tag': 1 }, {'time': new Date(1000), 'content':'cccc', 'tag': 1}]

2. 要求

按照tag进行分组,同一组的合并content属性,然后用reduce进行分组,并返回新数组

我写的只能返回一个对象

arr.reduce((pre,cur)=>{
    // console.log(pre)
    const tag = pre?.tag
    if(tag == cur.tag){
        pre.content += cur.content
        return pre
    }else
    return cur
},[])

echo_lovely的主页 echo_lovely | 小虾三级 | 园豆:1534
提问于:2023-01-06 10:26
< >
分享
最佳答案
0

简单粗暴

let m = [];
arr.forEach(x => {
    let sameData = m.find(y => y.tag === x.tag);
    if (sameData) {
        sameData.content += x.content;
    } else {
        m.push(x);
    }
});
console.log(m);
收获园豆:10
复制粘贴机器人 | 小虾三级 |园豆:720 | 2023-01-06 10:41
const arr = [{ 'time': new Date(0), 'content': 'aaaa', 'tag': 0 }, { 'time': new Date(0), 'content': 'bbb', 'tag': 1 }, {'time': new Date(1000), 'content':'cccc', 'tag': 1}]
	var newArr = arr.reduce((pre, cur)=>{
		const tag = pre.at(-1)? pre.at(-1).tag:""
		if(tag == cur.tag){
		   if(pre.at(-1))pre.at(-1).content+= cur.content;
			else pre.push(cur)
		}else{
			pre.push(cur)
		}
		return pre
	},[])
	
	console.log("===============================================")
	console.log(newArr)
echo_lovely | 园豆:1534 (小虾三级) | 2023-01-06 10:47

按这个也可以

echo_lovely | 园豆:1534 (小虾三级) | 2023-01-06 10:47

@echo_lovely:
你这个有点问题,你比较的tag是俩个相邻数据的tag

const arr = [{ 'time': new Date(0), 'content': 'aaaa', 'tag': 0 }, { 'time': new Date(0), 'content': 'bbb', 'tag': 1 }, {'time': new Date(1000), 'content':'cccc', 'tag': 1},{ 'time': new Date(0), 'content': 'dddd', 'tag': 0 }]
复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-01-06 10:57

@复制粘贴机器人: 是的,这块数据结构是我设计的,一样的tag我放在一起,但是一样的tag数据量不一样

echo_lovely | 园豆:1534 (小虾三级) | 2023-01-06 11:00

@复制粘贴机器人: 我决定还是用你的方法来,我发现这么操作数据会修改原数组,这样不行!

echo_lovely | 园豆:1534 (小虾三级) | 2023-01-06 11:00

@echo_lovely: 好叭

复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-01-06 11:00

@echo_lovely: 我的也会改啊 毕竟是引用类型 如果不想改原数组的话 push那写成

m.push({...x})

或者用其他方式深拷贝一下

复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-01-06 11:05

@复制粘贴机器人: 我把它定义成了类,每次同tag都pop,然后new一个对象,填值,push进去

echo_lovely | 园豆:1534 (小虾三级) | 2023-01-06 14:00

但是你没有用到reduce

码磊姐姐 | 园豆:201 (菜鸟二级) | 2023-09-05 15:06

@码磊姐姐: 因为reduce只能拿到前1个和后1个,你也提到了,如果相同的tag没有在一起,那么reduce就做不了,当时基于这点我不建议用reduce
后面才知道数据支持这么写:

这块数据结构是我设计的,一样的tag我放在一起,但是一样的tag数据量不一样

复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-09-05 15:37
其他回答(2)
0
	var newArr = arr.reduce((pre, cur)=>{
		const tag = pre.at(-1)? pre.at(-1).tag:""
		if(tag == cur.tag){
		   if(pre.at(-1))pre.at(-1).content+= cur.content;
			else pre.push(cur)
		}else{
			pre.push(cur)
		}
		return pre
	},[])
	
	console.log("===============================================")
	console.log(newArr)
echo_lovely | 园豆:1534 (小虾三级) | 2023-01-06 10:48

你这个不对。你试试我这个数组:

const arr = [{ 'time': new Date(0), 'content': 'aaaa', 'tag':0 }, 
             { 'time': new Date(0), 'content': 'ooo', 'tag': 1 }, 
             {'time': new Date(1000), 'content':'cccc','tag':1},
             { 'time': new Date(0), 'content': 'bbb', 'tag': 0 },
             { 'time': new Date(0), 'content': 'ddd', 'tag': 2 },
             { 'time': new Date(0), 'content': 'eee', 'tag': 2 }           
            
];
支持(0) 反对(0) 码磊姐姐 | 园豆:201 (菜鸟二级) | 2023-09-05 15:05

@码磊姐姐: 这块数据结构是我设计的,一样的tag是是挨在一起的,你把你的tag为0的放一块,就可以了

支持(0) 反对(0) echo_lovely | 园豆:1534 (小虾三级) | 2023-09-08 08:48
0

是这样吗

const arr = [{ 'time': new Date(0), 'content': 'aaaa', 'tag': 0 }, { 'time': new Date(0), 'content': 'bbb', 'tag': 1 }, {'time': new Date(1000), 'content':'cccc', 'tag': 1}];
const newarr = [];
arr.reduce((pre,curr)=>{
    if(pre&&pre.tag===curr.tag){
        pre.content+=curr.content;
        newarr.push(pre)
        return pre;
    }else return curr
    
},{});
码磊姐姐 | 园豆:201 (菜鸟二级) | 2023-09-05 14:42

你这自己的数据跑的都不对啊 tag=0的数据都没了。而且也不知道你要取哪个值:
1.如果你是要arr.reduce的结果,那么reduce的initialValue不应该是{},而是[]
2.如果你是要newarr的结果,那么tag不同的时候newarr应该也要push

支持(1) 反对(0) 复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-09-05 15:41

@复制粘贴机器人: 对,我刚刚试了,我写的这个不行。第一个对象没办法和另一个作比较。所以说reduce不能用吗

支持(0) 反对(0) 码磊姐姐 | 园豆:201 (菜鸟二级) | 2023-09-05 15:44

@码磊姐姐: 能用,因为他的数据已经排序好了,是支持使用reduce的。他自己已经给出答案了。

支持(0) 反对(0) 复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-09-05 15:47

@复制粘贴机器人: 是,但是我写的这个数组好像不可以用,两个tag=0的数据并不相邻

支持(0) 反对(0) 码磊姐姐 | 园豆:201 (菜鸟二级) | 2023-09-05 15:54

@码磊姐姐: 是的,相同的tag如果不相邻,reduce就做不了,这是前置条件。

这块数据结构是我设计的,一样的tag我放在一起,但是一样的tag数据量不一样

但是这个问题的前置条件他已经解决了

支持(0) 反对(0) 复制粘贴机器人 | 园豆:720 (小虾三级) | 2023-09-05 16:00

@复制粘贴机器人: 明白了,谢谢~

支持(0) 反对(0) 码磊姐姐 | 园豆:201 (菜鸟二级) | 2023-09-05 16:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册