[英]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: 其次,使用flatMap
和map
像这样:
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
(尽管我认为这是一个很好的答案,请注意),这是一个依赖reduce
和spread 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)
没有spread
或flat
,利用[].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.