简体   繁体   English

嵌套在JSON对象数组中的JSON对象数组

[英]Array of JSON objects nested in array of JSON objects

I have a JSON array of objects of the format 我有以下格式的对象的JSON数组

var employees = 
[
  {
    "employee1": "employee1",
    "Details": [
      {
        "title": "Software Engineer",
        "EmployeeId": 451
      }
    ]
  },
  {
    "employee2": "employee2",
    "Details": []
  },
  {
    "employee3": "employee3",
    "Details": [
      {
        "title": "Test analyst",
        "EmployeeId": 453
      }
    ]
  },
  {
    "employee4": "employee4",
    "Details": [
      {
        "title": "Software engineer",
        "EmployeeId": 487
      },
      {
        "title": "Architect",
        "EmployeeId": 500
      }
    ]
  }
]

What's the best way to get the EmployeeIds? 获取EmployeeId的最佳方法是什么?

Expected output: 预期产量:

[451,453,487,500]

When I used: 当我使用时:

console.log(Object.assign({}, ...employees).Details.map(t=>t.EmployeeId))

It is returning the result as: 它返回的结果为:

[487,500]

Is there a way to concatenate other employee Ids in the result? 有没有办法在结果中串联其他员工ID?

Firstly - it's not JSON, just an array. 首先-它不是JSON,而只是一个数组。 Secondly, use flatMap and map like so: 其次,使用flatMapmap像这样:

 var employees = [{ "employee1": "employee1", "Details": [{ "title": "Software Engineer", "EmployeeId": 451 }] }, { "employee2": "employee2", "Details": [] }, { "employee3": "employee3", "Details": [{ "title": "Test analyst", "EmployeeId": 453 }] }, { "employee4": "employee4", "Details": [{ "title": "Software engineer", "EmployeeId": 487 }, { "title": "Architect", "EmployeeId": 500 } ] } ]; var ids = employees.flatMap(({ Details }) => Details.map(({ EmployeeId }) => EmployeeId)); console.log(ids); 

Polyfill without flatMap - courtesy of MDN's alternative : 不带flatMap Polyfill-由MDN替代

 var employees = [{ "employee1": "employee1", "Details": [{ "title": "Software Engineer", "EmployeeId": 451 }] }, { "employee2": "employee2", "Details": [] }, { "employee3": "employee3", "Details": [{ "title": "Test analyst", "EmployeeId": 453 }] }, { "employee4": "employee4", "Details": [{ "title": "Software engineer", "EmployeeId": 487 }, { "title": "Architect", "EmployeeId": 500 } ] } ]; var ids = employees.reduce((acc, { Details }) => acc.concat(Details.map(({ EmployeeId }) => EmployeeId)), []); console.log(ids); 

Instead of using flatMap which has questionable support (though I think it's a great answer, mind you) here's an answer that relies on reduce and the spread operator : 而不是使用具有可疑支持的flatMap (尽管我认为这是一个很好的答案,请注意),这是一个依赖reducespread operator的答案:

employees
  .reduce((a, v) => 
   ( v.Details && a.push(...v.Details.map(o=>o.EmployeeId)), a)
  , []);

without the spread , using flat 没有spread ,使用flat

employees
  .reduce((a, v) => 
   ( v.Details && a.push(v.Details.map(o=>o.EmployeeId)), a.flat(1))
  , []);

without spread or flat , utilizing [].concat.apply([], arr) 没有spreadflat ,利用[].concat.apply([], arr)

employees
  .reduce((a, v) => 
   ( v.Details && a.push(v.Details.map(o=>o.EmployeeId)), [].concat.apply([], a))
  , []);

Examples of these Working: 这些工作示例:

 var employees=[{employee1:"employee1",Details:[{title:"Software Engineer",EmployeeId:451}]},{employee2:"employee2",Details:[]},{employee3:"employee3",Details:[{title:"Test analyst",EmployeeId:453}]},{employee4:"employee4",Details:[{title:"Software engineer",EmployeeId:487},{title:"Architect",EmployeeId:500}]}]; let _ // setup our methods and name them ( array_concat = employees.reduce((a, v) => ( v.Details && a.push(v.Details.map(o=>o.EmployeeId)), [].concat.apply([], a)), []) ) .name = "Using Array#concat", ( spread = employees.reduce((a, v) => ( v.Details && a.push(...v.Details.map(o=>o.EmployeeId)), a), []) ) .name = "Using Spread Operator", ( flat = employees.reduce((a, v) => ( v.Details && a.push(v.Details.map(o=>o.EmployeeId)), a.flat(1)), []) ) .name = "Using Flat", // test if it works! isCorrect = (arr, json = JSON.stringify(arr), {name} = arr) => console.info( json === "[451,453,487,500]" ? `${name} Passed!` : `${name} Failed`); isCorrect(array_concat); isCorrect(spread); isCorrect(flat); 

You could try a nested reduce approach. 您可以尝试嵌套的reduce方法。 This works quickly and doesn't make use of anything ES5 or higher. 这可以快速运行,并且不会使用任何ES5或更高版本。

 var employees = [{ "employee1": "employee1", "Details": [{ "title": "Software Engineer", "EmployeeId": 451 }] }, { "employee2": "employee2", "Details": [] }, { "employee3": "employee3", "Details": [{ "title": "Test analyst", "EmployeeId": 453 }] }, { "employee4": "employee4", "Details": [{ "title": "Software engineer", "EmployeeId": 487 }, { "title": "Architect", "EmployeeId": 500 } ] } ]; var ids = employees.reduce(function(a, b) { return b.Details.reduce(function(c, d) { c.push(d.EmployeeId); return c; }, a); }, []); console.log(ids); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM