首页 > 解决方案 > 根据属性拆分数组的值,然后形成一个新的对象数组

问题描述

我有一个包含具有以下结构的数组的对象:

var obj  = {
  "feature1" : ["val1","val2"],
  "feature2" : ["val3"]
}

现在我想拆分每个数组中存在的值并形成一个新的对象数组,它们应该像:

var result = [
  {
    "field": "feature1",
    "value": "val1",
    "type": "add"
  },
  {
    "field": "feature1",
    "value": "val2",
    "type": "add"
  },
  {
    "field": "feature2",
    "value": "val3",
    "type": "add"
  }
]

此处必须根据“字段”进行拆分,并显示与上述类似的内容。此处“类型”是硬编码的额外字段

帮助将不胜感激。

标签: javascriptarraysecmascript-6

解决方案


您可以获取键/值对,遍历它们,然后遍历每个数组中的每个值,然后将每个值推入一个对象,然后返回累加器

var obj = {
  "feature1": ["val1", "val2"],
  "feature2": ["val3"]
}

const output = Object.entries(obj)
  .reduce((a, [k, v]) => a
    .concat(v
      .map(e => ({
        field: k,
        value: e,
        type: 'add'
      })
    )
  ), [])


console.log(output)

或者,作为一行可读性较差的版本:

var obj = {
  "feature1": ["val1", "val2"],
  "feature2": ["val3"]
}

const output = Object.entries(obj).reduce((a, [k, v]) => a.concat(v.map(e => ({field: k, value: e, type: 'add'}))), [])

console.log(output)

对于更注重性能的解决方案,您应该使用普通的旧 for 循环:

var obj = {
  "feature1": ["val1", "val2"],
  "feature2": ["val3"]
}

const out = []

for (var o in obj) {
  const arr = obj[o]
  for(var i = 0; i < arr.length; i++) {
    out.push({
      field: o,
      value: arr[i],
      type: 'add'
    })
  }
}

console.log(out)

这是一个显示性能差异 的JSPerfJSPerf


编辑:

var obj = {
  "feature1": ["1", "1", "2", "3", "1"],
  "feature2": ["val3"]
}

const output = Object.entries(obj).reduce((a, [k, v]) => a.concat([...new Set(v)].map(e => ({field: k, value: e, type: 'add'}))), [])

console.log(output)


推荐阅读