如何将一个对象转换为带有嵌套对象的数组?

时间:2019-07-29 13:16:48

标签: javascript arrays object

我得到了一个包含一些值的对象。

如何正确转换?

我尝试了诸如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'属性,要么根本不插入。

2 个答案:

答案 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.someArray.prototype.filter以及Array.prototype.mapArray.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)