【问题标题】:Splitting the values of an array based on a property and then form a new array of objects [duplicate]根据属性拆分数组的值,然后形成一个新的对象数组[重复]
【发布时间】:2019-07-24 07:30:32
【问题描述】:

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

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"
  }
]

这里的拆分必须基于“字段”,它显示的内容与上面类似。这里的“类型”是一个额外的字段,是硬编码的

我们将不胜感激。

【问题讨论】:

  • 请先尝试一下
  • 循环遍历对象的键并在其中循环遍历每个值数组。请添加您目前尝试过的代码

标签: javascript arrays ecmascript-6


【解决方案1】:

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

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)

这是一个JSPerf 来显示性能差异


编辑:

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)

【讨论】:

  • 谢谢。有效。如果该字段下有重复值,如何避免重复值?假设有一些东西 "feature1" : ["1","2","1"],不想要多个 1 的值
  • @vrosario 你可以使用一个集合来删除它们,我现在添加一个编辑。
猜你喜欢
  • 2018-10-07
  • 2015-03-14
  • 2019-05-05
  • 2022-01-18
  • 2019-12-28
  • 2020-04-08
  • 1970-01-01
  • 2013-12-22
  • 2016-11-08
相关资源
最近更新 更多