【问题标题】:Reduce() an object of an element that has already been reducedReduce() 已经被缩减的元素的对象
【发布时间】:2019-04-27 00:45:17
【问题描述】:

我在做一些数据操作,但是我犯了一个错误,得到了错误的数据结构,所以最初我的数据是:(link to data)

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", "11-20": "40", "11-21": "50", "11-22": "60"},
   { "EmployeeID": "100B", "11-19": "1", "11-20": "2", "11-21": "3", "11-22": "4"}
]

我四处询问,这给了我 10 个对象而不是 2 个,只需将那些讨厌的employeeID 放入 1 个对象中,并包含所有起始值。

const res = employees.reduce((acc, { EmployeeID, aval}) => [
      ...acc,
      ...aval.map( ({ start, ava}) => ({ EmployeeID, [start]: ava}) )
    ], []);

【问题讨论】:

    标签: javascript arrays angular object reduce


    【解决方案1】:

    由于您的输入项和输出项是一对一的,因此您应该在employees 上使用.map 而不是.reduce

    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 res = employees.map(({ EmployeeID, aval }) => (
      Object.assign(
        { EmployeeID },
        ...aval.map(({ start, ava }) => ({ [start]: ava }))
      )
    ));
    console.log(res);

    或者,如果你想创建更少的丢弃中间对象,你可以reduce内部数组aval而不是.map

    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 res = employees.map(({ EmployeeID, aval }) => (
      aval.reduce((a, { start, ava }) => {
        a[start] = ava;
        return a;
      }, { EmployeeID })
    ));
    console.log(res);

    【讨论】:

    • 很好,谢谢。除了 MDN 站点之外,还有什么建议可以学习减少或古怪的数据结构?
    • 学reduce,如in,什么时候用,怎么用?
    • 如中,如何以及何时实施?,也许实践一下。这似乎是我最麻烦的科目之一。 MDN 定义并没有真正的帮助
    • 何时使用:当您需要将一个数组转换为另一个值时,例如基元、对象或另一个数组。如果.map.filter 都不合适,则仅使用reduce。方法:当归约为一个基元时,通常你可以使用 MDN 上给出的那种 sn-ps,例如(a, b) => a + b,只需将累加器与数组中的下一项连接/加/乘/等。但通常它有点复杂,比如在缩减为一个对象时。 a[prop] = val; return a; 模式非常常见。您可以搜索 SO 以查找包含 reduce 的高级用户的答案,例如
    • 当您需要将数组转换为一个值(或多个值)时,如果其他转换方法(排除 forEach)不合适,您几乎总是可以使用.reduce,请随意点击我在聊天中了解详情
    猜你喜欢
    • 2022-11-09
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多