输入:
var json =
[
{
"inventory":{
"name":"SF Home",
"items":{
"items":[
{
"id":"d98e55d3-8ada-4937-bded-d6f8d948eb4a",
"name":"SICP (functional programming)"
},
{
"id":"fc490ac2-449e-4aaf-95c5-a993ec220ec9",
"name":"Learn Python the hard way!"
},
]
}
}
},
{
"inventory":{
"name":"SEA Home",
"items":{
"items":[
{
"id":"7126a7c2-3328-4bb4-b425-66adb8ad9b28",
"name":"FP in Scala"
}
]
}
}
}
]
这是预期的输出:
var expected = [
{
id: 'd98e55d3-8ada-4937-bded-d6f8d948eb4a',
name: 'SICP (functional programming)',
inventory_name: "SF Home"
},
{
id: 'fc490ac2-449e-4aaf-95c5-a993ec220ec9',
name: 'Learn Python the hard way!',
inventory_name: "SF Home"
},
{
id: '7126a7c2-3328-4bb4-b425-66adb8ad9b28',
name: 'FP in Scala',
inventory_name: "SEA Home"
}
]
但是,我只能使用lodash(请参阅Repl.it playground)来获得以下结果(没有inventory_name
):
const _ = require('lodash');
const actual = _.chain(json).map("inventory.items.items").flatten().value();
实际输出:
[ { id: 'd98e55d3-8ada-4937-bded-d6f8d948eb4a',
name: 'SICP (functional programming)' },
{ id: 'fc490ac2-449e-4aaf-95c5-a993ec220ec9',
name: 'Learn Python the hard way!' },
{ id: '7126a7c2-3328-4bb4-b425-66adb8ad9b28',
name: 'FP in Scala' } ]
结果中缺少 inventory_name
。但是我想将inventory_name
下沉到嵌套的JSON。有人可以使用lodash来填补空白吗?谢谢!
答案 0 :(得分:2)
为此,您不需要像Lodash这样的外部库-您可以使用flatMap
提取每个name
和items
数组,并创建一个由项对象及其关联的inventory_name
:
var json=[{"inventory":{"name":"SF Home","items":{"items":[{"id":"d98e55d3-8ada-4937-bded-d6f8d948eb4a","name":"SICP (functional programming)"},{"id":"fc490ac2-449e-4aaf-95c5-a993ec220ec9","name":"Learn Python the hard way!"},]}}},{"inventory":{"name":"SEA Home","items":{"items":[{"id":"7126a7c2-3328-4bb4-b425-66adb8ad9b28","name":"FP in Scala"}]}}}]
const output = json.flatMap(({ inventory: { name, items }}) => (
items.items.map(item => ({ ...item, inventory_name: name }))
));
console.log(output);
或者,如果没有flatMap
,则可以reduce
:
var json=[{"inventory":{"name":"SF Home","items":{"items":[{"id":"d98e55d3-8ada-4937-bded-d6f8d948eb4a","name":"SICP (functional programming)"},{"id":"fc490ac2-449e-4aaf-95c5-a993ec220ec9","name":"Learn Python the hard way!"},]}}},{"inventory":{"name":"SEA Home","items":{"items":[{"id":"7126a7c2-3328-4bb4-b425-66adb8ad9b28","name":"FP in Scala"}]}}}]
const output = json.reduce((a, { inventory: { name, items }}) => a.concat(
items.items.map(item => ({ ...item, inventory_name: name }))
), []);
console.log(output);
答案 1 :(得分:0)
您可以通过Array#reduce
方法来实现,而无需使用破折号,如下所示:
var json=[{"inventory":{"name":"SF Home","items":{"items":[{"id":"d98e55d3-8ada-4937-bded-d6f8d948eb4a","name":"SICP (functional programming)"},{"id":"fc490ac2-449e-4aaf-95c5-a993ec220ec9","name":"Learn Python the hard way!"}]}}},{"inventory":{"name":"SEA Home","items":{"items":[{"id":"7126a7c2-3328-4bb4-b425-66adb8ad9b28","name":"FP in Scala"}]}}}];
/* Iterate over input json and reduce the nested arrays into a single flat
array for expected */
var expected = json.reduce((result, item) => {
/* For inventory item of this iteration, map each item of
item.inventory.items.items to the data shape for items in the resulting
expected array. The mapped result is concatenated to the result which
will be returned to expected */
return result.concat(item.inventory.items.items.map(inventory => {
/* Map the id and name of current inventory, as well as
item.inventory.name to inventory_name
for each item of expected array */
return {
id: inventory.id,
name: inventory.name,
inventory_name: item.inventory.name
}
}))
}, []);
console.log(expected);