Сократить один массив, содержащий объекты, которые могут иметь или не иметь одинаковое значение, в массив из отдельных уникальных объектов - PullRequest
0 голосов
/ 30 августа 2018

Не совсем уверен, как спросить это кратко. Допустим, у меня есть массив объектов такой, что:

`{ title: 'The first title',
published_on: '2018-08-10 21:47:28',
body_content: '',
image_content: 'the first image'},
{ title: 'The first title',
published_on: '2018-08-10 21:47:28',
body_content: 'some content',
image_content: '' },
{ title: 'The second title',
published_on: '2018-08-06 17:08:28',
body_content: '',
image_content: 'an image url' },
{ title: 'The second title',
published_on: '2018-08-06 17:08:28',
body_content: 'a bunch of stuff',
image_content: '' } ]`

и что мне нужно, так это объединить объекты с одинаковыми значениями с любыми другими ключами:

`theArrayIWant = [
{ title: 'The first title',
published_on: '2018-08-10 21:47:28',
body_content: 'some content',
image_content: 'the first image' },
{ title: 'The second title',
published_on: '2018-08-06 17:08:28',
body_content: 'a bunch of stuff',
image_content: 'an image url' }
]`

Я пытался найти простое решение для этого. Я знаю, что должно быть. Я использую спагеттифицированные для циклов и многих заполнителей, и он просто чувствует себя не так

редактирование: ...etc i означало быть больше объектов того же типа. В моем примере свойство title является единственным, где может быть объект с тем же ключом. Я хочу, чтобы они стали единым объектом, если есть соответствующий объект, включая свойства, которые могут иметь соответствующий объект.

edit 2: Я включил точные объекты, с которыми я работаю

1 Ответ

0 голосов
/ 30 августа 2018

Вы можете собрать все свойства в одном объекте, имеющем одно и то же свойство title.

Это делается с использованием объекта и title в качестве ключа.

var original = [{ title: "example name", image: "abcd" }, { title: "example name", content: "efgh" }, { title: "another name", image: "some image" }, { title: "another name", content: "some stuff" }],
    result = Object.values(original.reduce((r, o) => {
        Object.assign(r[o.title] = r[o.title] || {}, o);
        return r;
    }, {}));
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Изменить для измененного требования с проверкой на пустые элементы.

var original = [{ title: 'The first title', published_on: '2018-08-10 21:47:28', body_content: '', image_content: 'the first image' }, { title: 'The first title', published_on: '2018-08-10 21:47:28', body_content: 'some content', image_content: '' }, { title: 'The second title', published_on: '2018-08-06 17:08:28', body_content: '', image_content: 'an image url' }, { title: 'The second title', published_on: '2018-08-06 17:08:28', body_content: 'a bunch of stuff', image_content: '' }],
    result = Object.values(original.reduce((r, o) => {
        if (!r[o.title]) {
            r[o.title] = o;
            return r;
        }
        Object.entries(o).forEach(([k, v]) => v === '' || (r[o.title][k] = v));
        return r;
    }, {}));
    
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...