我得到了一个包含一些值的对象。
如何正确转换?
我尝试了诸如include(),find(),some(),for循环之类的多种操作,但似乎检查对象中是否包含'conversationWith'失败。
对象看起来像这样:
{
_id: 5d3eed4b8558ab0fc513a3b5,
subject: 'Subject',
message: 'Message',
newMessage: true,
from: 5d3b0585181c521610a15241,
fromName: 'John Doe',
to: 5d3b0749c9b633171fa62a48,
toName: 'Leeroy Jenkins',
conversationWith: 'Leeroy Jenkins'
}
{
_id: 5d3eed608558ab0fc513a3b7,
subject: '2nd',
message: '2nd',
newMessage: true,
from: 5d3b0585181c521610a15241,
fromName: 'John Doe',
to: 5d3b0749c9b633171fa62a48,
toName: 'Leeroy Jenkins',
conversationWith: 'Leeroy Jenkins'
}
{
_id: 5d3ef15e6a570c1201457918,
subject: '3rd',
message: '3rd',
newMessage: true,
from: 5d3b0585181c521610a15241,
fromName: 'John Doe',
to: 5d3b0749c9b633171fa62a48,
toName: 'Leeroy Jenkins',
conversationWith: 'Leeroy Jenkins'
}
我想从中创建一个像这样的数组:
[{
conversationWith: "Leeroy Jenkins",
message: ["Message", "2nd", "3rd"]
}]
问题是我有多个要遍历的对象,我只想将'conversationWith'属性插入到数组一次,而我希望所有消息都在其中。
我要么多次插入'conversationWith'属性,要么根本不插入。
答案 0 :(得分:2)
您可以使用简单的forEach
循环
var a= [{
_id: '5d3eed4b8558ab0fc513a3b5',
subject: 'Subject',
message: 'Message',
newMessage: true,
from: '5d3b0585181c521610a15241',
fromName: 'John Doe',
to: '5d3b0749c9b633171fa62a48',
toName: 'Leeroy Jenkins',
conversationWith: 'Leeroy Jenkins'
},
{
_id: '5d3eed608558ab0fc513a3b7',
subject: '2nd',
message: '2nd',
newMessage: true,
from: '5d3b0585181c521610a15241',
fromName: 'John Doe',
to: '5d3b0749c9b633171fa62a48',
toName: 'Leeroy Jenkins',
conversationWith: 'Leeroy Jenkins'
},
{
_id: '5d3ef15e6a570c1201457918',
subject: '3rd',
message: '3rd',
newMessage: true,
from: '5d3b0585181c521610a15241',
fromName: 'John Doe',
to: '5d3b0749c9b633171fa62a48',
toName: 'Leeroy Jenkins',
conversationWith: 'Leeroy Jenkins'
}]
var b=[];
var bool=false;
a.forEach(function(e){
b.forEach(function(k){
if(k.conversationWith==e.conversationWith)
{
bool=true;
k.message.push(e.message)
}
})
if(bool==false)
{
var obj={};
obj.conversationWith=e.conversationWith;
obj.message=[];
obj.message.push(e.message);
b.push(obj);
}
bool=false;
})
console.log(b)
答案 1 :(得分:0)
减少数组的方法
reduce()方法在数组的每个元素上执行一个reducer函数(由您提供),从而产生单个输出值。
使用Array.prototype.reduce
返回使用Array.prototype.some
和Array.prototype.filter
以及Array.prototype.map
和Array.prototype.join
从源数组创建的新对象数组,以适应并加入消息一起
https://repl.it/repls/TealVitalDatum
const LEROY = 'Leeroy Jenkins';
const convoWithMessage = [{
_id: '5d3eed4b8558ab0fc513a3b4',
subject: 'Subject',
message: 'Message',
newMessage: true,
from: '5d3b0585181c521610a15241',
fromName: 'John Doe',
to: '5d3b0749c9b633171fa62a48',
toName: 'Leeroy Jenkins',
conversationWith: 'John Doe'
}, {
_id: '5d3eed4b8558ab0fc513a3b4',
subject: 'Subject',
message: 'Message',
newMessage: true,
from: '5d3b0585181c521610a15241',
fromName: 'John Doe',
to: '5d3b0749c9b633171fa62a48',
toName: 'Leeroy Jenkins',
conversationWith: 'John Doe'
}].reduce((acc, item, index, array) => {
const isLeroy = d => d.toName === LEROY;
const leroys = acc.filter(isLeroy);
if (item.toName === LEROY) {
if (array.some(isLeroy)) {
const message = [item.message, ...leroys.map(i => i.message)];
return [...leroys.filter(isLeroy), { name: LEROY, message }]
}
}
return [...acc, { toName: item.toName, message: item.message }];
}, [])
console.log(convoWithMessage)