【问题标题】:Convert nested Array -> arrays -> object TO Array -> Object => object value : object value将嵌套数组 -> 数组 -> 对象转换为数组 -> 对象 => 对象值:对象值
【发布时间】:2019-04-26 21:08:47
【问题描述】:

在下面的数据中。我想让它成为一个对象,其中一些值作为键,如下所示:

FROM HERE:链接到整个数据HERE (this.localObject)

const employees = [{
    "EmployeeID": "100A",
    "FirstName": "Downs",
    "aval": [
       {"start": "11-19", "end": "2", "ava": "30", "health": "4"},
       {"start": "11-20", "end": "2", "ava": "40", "health": "4"},
       {"start": "11-21", "end": "2", "ava": "50", "health": "4"},
       {"start": "11-22", "end": "2", "ava": "60", "health": "4"}
    ]
  },
  {
    "EmployeeID": "100B",
    "FirstName": "Mckenzie",
    "aval": [
       {"start": "11-19", "end": "2", "ava": "1", "health": "4"},
       {"start": "11-20", "end": "2", "ava": "2", "health": "4"},
       {"start": "11-21", "end": "2", "ava": "3", "health": "4"},
       {"start": "11-22", "end": "2", "ava": "4", "health": "4"}
    ]
  },
]

到这里:

const employees = [
   { "EmployeeID": "100A", "11-19": "30"},
   { "EmployeeID": "100A", "11-20": "40"},
   { "EmployeeID": "100A", "11-21": "50"},
   { "EmployeeID": "100A", "11-22": "60"},
   { "EmployeeID": "100B", "11-19": "1"},
   { "EmployeeID": "100B", "11-20": "2"},
   { "EmployeeID": "100B", "11-21": "3"},
   { "EmployeeID": "100B", "11-22": "4"}
]

//and so on...

到目前为止我已经尝试过:

this.localData = this.localObject.employees;
const firstLevel = this.localData.map(x => x.aval);

firsLevel 会给我一个更接近我需要的对象数组,现在我需要将 "start" 值作为键和 "ava" 值作为自己的对象容器内的值属性

【问题讨论】:

    标签: javascript arrays angular object reduce


    【解决方案1】:

    您还需要迭代内部数组并构建单个数组。

    var array = [{ EmployeeID: "100A", FirstName: "Downs", aval: [{ start: "11-19", end: "2", ava: "30", health: "4" }, { start: "11-20", end: "2", ava: "40", health: "4" }, { start: "11-21", end: "2", ava: "50", health: "4" }, { start: "11-22", end: "2", ava: "60", health: "4" }] }, { EmployeeID: "100B", FirstName: "Mckenzie", aval: [{ start: "11-19", end: "2", ava: "1", health: "4" }, { start: "11-20", end: "2", ava: "2", health: "4" }, { start: "11-21", end: "2", ava: "3", health: "4" }, { start: "11-22", end: "2", ava: "4", health: "4" }] }],
        result = array.reduce((r, { EmployeeID, aval }) => [
            ...r,
            ...aval.map(({ start, ava }) => ({ EmployeeID, [start]: ava }))
        ], []);
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 很好,请问有什么好的资源来学习 reduce() 吗?这不是我的强项
    • 你可以从这里开始:Array#reduce,但我没有其他资源。只是尝试经常使用它...
    【解决方案2】:

    您可以使用Array.flatMap 并使用Array.map 迭代其中的aval,如下所示

    const employees = [{
        "EmployeeID": "100A",
        "FirstName": "Downs",
        "aval": [
           {"start": "11-19", "end": "2", "ava": "30", "health": "4"},
           {"start": "11-20", "end": "2", "ava": "40", "health": "4"},
           {"start": "11-21", "end": "2", "ava": "50", "health": "4"},
           {"start": "11-22", "end": "2", "ava": "60", "health": "4"}
        ]
      },
      {
        "EmployeeID": "100B",
        "FirstName": "Mckenzie",
        "aval": [
           {"start": "11-19", "end": "2", "ava": "1", "health": "4"},
           {"start": "11-20", "end": "2", "ava": "2", "health": "4"},
           {"start": "11-21", "end": "2", "ava": "3", "health": "4"},
           {"start": "11-22", "end": "2", "ava": "4", "health": "4"}
        ]
      },
    ]
    
    let res = employees.flatMap(({ EmployeeID, aval }) => 
                        aval.map(({ start, ava }) => ({ EmployeeID, [start]: ava })))
    
    console.log(res)

    【讨论】:

    • 看起来,你是flatMap 的忠实粉丝,这实际上在边缘不起作用......
    • 哦,是的,我是(在了解它的力量之后)。考虑到“Edge”的情况,我怀疑它是否至少支持其他 ESNext 功能。但我们绝不应该因为 Edge 而错过任何新功能。 :)
    • 伙计,我喜欢这个答案,但我使用的框架在 ES6 上存在问题,并且不能很好地与 FlatMap 配合使用,他们正在研究解决方案
    • 没问题@brohymn。 :)
    • 不错的一个...flatMap 对 polyfill 来说是微不足道的