Группировать комментарии по идентификатору постов в объекте - PullRequest
0 голосов
/ 25 сентября 2018

Когда я получаю свои комментарии с сервера, они появляются в виде массива комментариев.

[
    { content: "foo1", postId: 1 },
    { content: "foo2", postId: 1 },
    { content: "foo3", postId: 1 },
    { content: "foo4", postId: 2 },
    { content: "foo5", postId: 2 },
    { content: "foo6", postId: 3 }
]

Я хотел бы сгруппировать их в объект, подобный:

{
    1: [
        { content: "foo1", postId: 1 },
        { content: "foo2", postId: 1 },
        { content: "foo3", postId: 1 }
    ],
    2: [
        { content: "foo4", postId: 2 },
        { content: "foo5", postId: 2 }
    ],
    3: [
        { content: "foo6", postId: 3 }
    ]
}

IЯ уверен, что это легко, и я пробовал много комбинаций с lodash, используя groupBy или keyBy с assign, но я все еще не нашел правильный ответ.Я пользуюсь lodash.

Ответы [ 4 ]

0 голосов
/ 25 сентября 2018

Вы можете следовать по этому пути:

var array = [
    { content: "foo1", postId: 1 },
    { content: "foo2", postId: 1 },
    { content: "foo3", postId: 1 },
    { content: "foo4", postId: 2 },
    { content: "foo5", postId: 2 },
    { content: "foo6", postId: 3 }
];
var result = {};
array.map(current=>{
    //find key
    if(result.hasOwnProperty(current.postId)){
        //exist the key postId, let add
        result[current.postId].push(current);
    }else{
        //not exist key postId, add new object to result
        result[current.postId] = [];
        Object.assign(result[current.postId], [current]);
    };
});
console.log(result);
0 голосов
/ 25 сентября 2018

С ES6 вы можете попробовать это:

const grouped = comments.reduce((map, comment) => {
    if (!map.hasOwnProperty(comment.postId)) 
       map[comment.postId] = []
    map[comment.postId].push(comment)
    return map
}, {});
0 голосов
/ 25 сентября 2018
 var array = [
    { content: "foo1", postId: 1 },
    { content: "foo2", postId: 1 },
    { content: "foo3", postId: 1 },
    { content: "foo4", postId: 2 },
    { content: "foo5", postId: 2 },
    { content: "foo6", postId: 3 }
    ];

var formatedData = _.groupBy(array, 'postId');
0 голосов
/ 25 сентября 2018

Используйте _.groupBy из lodash с функциональным обратным вызовом, чтобы вернуть postId, например

const arr = [
    { content: "foo1", postId: 1 },
    { content: "foo2", postId: 1 },
    { content: "foo3", postId: 1 },
    { content: "foo4", postId: 2 },
    { content: "foo5", postId: 2 },
    { content: "foo6", postId: 3 }
]

console.log(_.groupBy(arr, function(obj) { return obj.postId}))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
...