Лучший способ сопоставить этот объект в новый объект - PullRequest
0 голосов
/ 25 сентября 2018

Используя lodash или vanilla javascript, мне нужно преобразовать этот json:

{
  "results" : [
    {
        "values" : [
            {"label" : "FOO", "value"  : "foovalue" },
            {"label" : "BAR", "value" : "barvalue1" },
            {"label" : "BAR", "value" : "barvalue2" }
        ]
    },
    {
        "values" : [
            {"label" : "FOO", "value"  : "foovalue"},
            {"label" : "BAR", "value" : "barvalue1"},
            {"label" : "BAR", "value" : "barvalue2"}
        ]
   }
    ]
}

в новый объект, где значения меток становятся ключом, а дубликаты превращаются в массив новых объектов, таких как:

[
    [{"FOO" : "foovalue", "BAR" : ["barvalue1", "barvalue2"]}], 
    [{"FOO" : "foovalue", "BAR" : ["barvalue1", "barvalue2"]}]
]

Я пытался использовать _.map, но он перезаписывает повторяющиеся значения, и мне нужно, чтобы они все были в массиве.

Вот самое близкое, что я получил:

var arr = _.map(results, function(o) {
    return _.map(o.values, function(v) {
        var obj = {};
        obj[t.label] = t.value;
        return obj;
    });
});

, где arr возвращает массив таких объектов (с перезаписываемыми объектами, а не объединенными в один объект) [{"FOO" : "foovalue"},{"BAR" : "barvalue2"}], и я застреваю, пытаясь превратить их в вышеуказанный массив.

1 Ответ

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

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

var results = [{ values: [{ label: "FOO", value: "foovalue" }, { label: "BAR", value: "barvalue1" }, { label: "BAR", value: "barvalue2" }] }, { values: [{ label: "FOO", value: "foovalue" }, { label: "BAR", value: "barvalue1" }, { label: "BAR", value: "barvalue2" }] }],
    grouped = results.map(({ values }) => [
        values.reduce((o, { label, value }) => {
            if (!o[label]) {
                o[label] = value;
                return o;
            }
            if (!Array.isArray(o[label])) {
                o[label] = [o[label]];
            }
            o[label].push(value);
            return o;
        }, {})
    ]);
    
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...