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}]
按照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
},[])
简单粗暴
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);
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:
你这个有点问题,你比较的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 }]
@复制粘贴机器人: 是的,这块数据结构是我设计的,一样的tag我放在一起,但是一样的tag数据量不一样
@复制粘贴机器人: 我决定还是用你的方法来,我发现这么操作数据会修改原数组,这样不行!
@echo_lovely: 好叭
@echo_lovely: 我的也会改啊 毕竟是引用类型 如果不想改原数组的话 push那写成
m.push({...x})
或者用其他方式深拷贝一下
@复制粘贴机器人: 我把它定义成了类,每次同tag都pop,然后new一个对象,填值,push进去
但是你没有用到reduce
@码磊姐姐: 因为reduce只能拿到前1个和后1个,你也提到了,如果相同的tag没有在一起,那么reduce就做不了,当时基于这点我不建议用reduce
。
后面才知道数据支持这么写:
这块数据结构是我设计的,一样的tag我放在一起,但是一样的tag数据量不一样
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)
你这个不对。你试试我这个数组:
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 }
];
@码磊姐姐: 这块数据结构是我设计的,一样的tag是是挨在一起的,你把你的tag为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
},{});
你这自己的数据跑的都不对啊 tag=0的数据都没了。而且也不知道你要取哪个值:
1.如果你是要arr.reduce的结果,那么reduce的initialValue不应该是{},而是[]
2.如果你是要newarr的结果,那么tag不同的时候newarr应该也要push
@复制粘贴机器人: 对,我刚刚试了,我写的这个不行。第一个对象没办法和另一个作比较。所以说reduce不能用吗
@码磊姐姐: 能用,因为他的数据已经排序好了,是支持使用reduce的。他自己已经给出答案了。
@复制粘贴机器人: 是,但是我写的这个数组好像不可以用,两个tag=0的数据并不相邻
@码磊姐姐: 是的,相同的tag如果不相邻,reduce就做不了,这是前置条件。
这块数据结构是我设计的,一样的tag我放在一起,但是一样的tag数据量不一样
但是这个问题的前置条件他已经解决了
@复制粘贴机器人: 明白了,谢谢~