Как я могу объединить объекты на основе одного и того же значения в массиве объектов - PullRequest
0 голосов
/ 22 июня 2019

У меня есть массив из нескольких объектов. У каждого объекта есть ключ «id». Я хочу объединить объекты на основе того же значения «id».

var obj = [{'id': 1, 'title': 'Hi'}, {'id': 1, 'description': 'buddy'}, {'id': 2, 'title': 'come'}, {'id': 2, 'description': 'On'}]

And i want output something like that

var new_obj = [{'id': 1, 'title': 'Hi' 'description': 'buddy'}, {id: 2, 'title': 'come', 'description': 'on'}]

Ответы [ 3 ]

0 голосов
/ 26 июня 2019

Вот решение

const data = [
    {
        id: 1,
        title: "Hi"
    },
    {
        description: "buddy",
        id: 1
    },
    {
        id: 2,
        title: "come"
    },
    {
        description: "On",
        id: 2
    }
]

const f = (data) => 
  Object.values(data.reduce(
    (y, x) => ({
      ...y, 
      [x.id]: {
        ...x, 
        ...(y[x.id] || {})
      },
    }),
    {},
  ))
console.log(f(data))

Вот решение с использованием Ramda.js

const data = [
    {
        id: 1,
        title: "Hi"
    },
    {
        description: "buddy",
        id: 1
    },
    {
        id: 2,
        title: "come"
    },
    {
        description: "On",
        id: 2
    }
]

const f = R.compose(R.values, R.reduceBy(R.merge, {}, R.prop('id')))

console.log(f(data))
<script src="//cdn.jsdelivr.net/npm/ramda@latest/dist/ramda.min.js"></script>
0 голосов
/ 03 июля 2019

Так работает:

let toMerge = [{'id': 1, 'title': 'Hi'}, {'id': 1, 'description': 'buddy'}, {'id': 2, 'title': 'come'}, {'id': 2, 'description': 'On'}]
let merged = []

for ( let object of toMerge ) {
    // if object not already merged
    if(!merged.find(o => o.id === object.id)) {
        // filter the same id's objects, merge them, then push the merged object in merged array
        merged.push(toMerge.filter(o => o.id === object.id).reduce((acc, val) => {return {...acc, ...val}}))
    }
}
0 голосов
/ 22 июня 2019

Вы можете уменьшить массив, найдя объект с таким же id и назначив объект найденному или получив новый объект.

var array = [{ id: 1, title: 'Hi' }, { id: 1, description: 'buddy' }, { id: 2, title: 'come' }, { id: 2, description: 'On' }],
    result = array.reduce((r, o) => {
        var temp = r.find(({ id }) => o.id === id);
        if (!temp) r.push(temp = {});
        Object.assign(temp, o);
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...