将此对象映射到新对象的最佳方法

时间:2018-09-25 10:51:39

标签: javascript lodash

使用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 :(得分:1)

您可以映射外部数组并通过收集标签的值来缩小内部数组。如果收集的元素不止一个,则使用数组。

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; }