将一个对象分割成多个对象,并将它们推入javascript中的数组中(可能使用下划线/lodash)

Splitting an object into multiple object and pushing them in an array in javascript(Possibly using underscore/lodash)

本文关键字:数组 lodash 下划线 分割 一个对象 对象 javascript      更新时间:2023-09-26

我想根据条件拆分数组中的对象。如果我得到这样的json响应:-

var obj = { dataSo : [{ key1 : "value1", key2 : "value.1.2", key3 : ["value1.3.1","value.1.3.2"]},
            { key1 : "value1", key2 : "value.2.2", key3 : ["value2.3.1","value2.3.2","value.2.3.3"]},
            { key1 : "value1", key2 : "value.3.2", key3 : ["value.3.3.1"]},
            { key1 : "value1", key2 : "value.4.2", key3 : []}]}

然后我必须检查key3是否有多个值。如果它确实包含多个值,那么我应该复制整个对象,同时保持key3的值不同,并复制它并将其作为新对象压入数组。

例如,从以前的数据,我应该做这样的东西:-

{ dataSo : [{ key1 : "value.1.1", key2 : "value.1.2", key3 : "value.1.3.1"},
            { key1 : "value.1.1", key2 : "value.1.2", key3 : "value.1.3.2"},
            { key1 : "value.2.1", key2 : "value.2.2", key3 : "value.2.3.1"},
            { key1 : "value.2.1", key2 : "value.2.2", key3 : "value.2.3.2"},
            { key1 : "value.2.1", key2 : "value.2.2", key3 : "value.2.3.3"},
            { key1 : "value.3.1", key2 : "value.3.2", key3 : "value.3.3.1"},
            { key1 : "value.4.1", key2 : "value.4.2", key3 : "" }]}

我怎样才能有效地做到这一点?

使用map,将每个元素爆炸成一个子元素数组,每个子元素对应key3的值。然后用concat:

将它们粘贴在一起
obj.dataSo = [].concat(...obj.dataSo.map(({key1, key2, key3}) =>
  key3.map(key3 => ({key1, key2, key3}))
);

请注意,此解决方案不处理非数组的key3值,如果key3为空,它将省略相应的元素。要解决这个问题,预处理key3:

obj.dataSo = [].concat(...obj.dataSo.map(({key1, key2, key3}) =>
  (!Array.isArray(key3) ? [key3] : key3.length ? key3 : [""]) .
    map(key3 => ({key1, key2, key3}))
});

该解决方案使用了ES6的特性,如扩展操作符、解构和对象文字简写。