Javascript 是否有更好的方法将子级别阵列组合成单个阵列?
假设我在艺术家(简化)阵列中有这些嵌套的专辑阵列:Javascript 是否有更好的方法将子级别阵列组合成单个阵列?,javascript,arrays,Javascript,Arrays,假设我在艺术家(简化)阵列中有这些嵌套的专辑阵列: const api = [ { "id": 1, "name": "John Coltrane", "albums": [ { "title": "Giant Steps" }, { "title": "A Love Supreme"}, { "title": "Tenor Madness"} ],
const api = [
{
"id": 1,
"name": "John Coltrane",
"albums": [
{ "title": "Giant Steps" },
{ "title": "A Love Supreme"},
{ "title": "Tenor Madness"}
],
"instrument": "Saxophone"
},
{
"id": 2,
"name": "Sonny Rollins",
"albums": [
{ "title": "Saxophone Colossus" },
{ "title": "The Bridge"},
{ "title": "Tenor Madness"}
],
"instrument": "Saxophone"
}
];
我想把所有相册合并成一个新的阵列,没有任何副本
到目前为止,我得到的是:
let albums = [];
api.forEach((api) => {
Object.keys(api).forEach((prop) => {
if (prop === 'albums') {
api[prop].forEach(album => albums.includes(album.title) ? '' : albums.push(album.title));
}
});
});
我想知道是否有更好、更简单的方法来实现这一点,和/或在一个包含大约5000名艺术家,每个人有5-20张专辑的数据集上,这是否会很慢
它确实解决了我的部分问题(非常有趣,谢谢!),但我更感兴趣的是如何处理数组的嵌套性质
谢谢 ES2015:
const result = api
.map(({albums}) => albums)
.reduce((res, albums) => res.concat(albums), [])
.reduce((res, {title}) =>
(!res.some(saved => saved === title) && res.push(title), res), []
);
ES2015:
const result = api
.map(({albums}) => albums)
.reduce((res, albums) => res.concat(albums), [])
.reduce((res, {title}) =>
(!res.some(saved => saved === title) && res.push(title), res), []
);
我鼓励您探索lodash库,通过函数式编程实现它。请参阅下面的代码,它是链接的,并且是声明性的、可读的、可维护的
const ret = _(api)
.map(x=>x.albums) // extract albums properties
.flatten() // flatten array of arrays to be array
.map(x=>x.title) // extract title
.uniq() // remove duplicacy
.value(); // trigger evaluation process
console.log(ret)
或者检查我鼓励您探索lodash库,通过函数式编程实现它。请参阅下面的代码,它是链接的,并且是声明性的、可读的、可维护的
const ret = _(api)
.map(x=>x.albums) // extract albums properties
.flatten() // flatten array of arrays to be array
.map(x=>x.title) // extract title
.uniq() // remove duplicacy
.value(); // trigger evaluation process
console.log(ret)
或者选中这里有一个利用
集合
的解决方案,它可以轻松地只添加一次内容:
let albums = [...api.reduce((result, {albums}) =>
albums.reduce((result, {title}) => result.add(title), result),
new Set()
)];
const-api=[
{
“id”:1,
“姓名”:“John Coltrane”,
“专辑”:[
{“标题”:“巨大的步伐”},
{“头衔”:“至高无上的爱”},
{“标题”:“男高音疯狂”}
],
“乐器”:“萨克斯管”
},
{
“id”:2,
“姓名”:“桑尼·罗林斯”,
“专辑”:[
{“标题”:“萨克斯管巨像”},
{“标题”:“桥梁”},
{“标题”:“男高音疯狂”}
],
“乐器”:“萨克斯管”
}
];
让albums=[…api.reduce((结果,{albums})=>
albums.reduce((result,{title})=>result.add(title),result),
新集合()
)];
控制台日志(相册)代码>这是一个利用集合
的解决方案,只需添加一次即可:
let albums = [...api.reduce((result, {albums}) =>
albums.reduce((result, {title}) => result.add(title), result),
new Set()
)];
const-api=[
{
“id”:1,
“姓名”:“John Coltrane”,
“专辑”:[
{“标题”:“巨大的步伐”},
{“头衔”:“至高无上的爱”},
{“标题”:“男高音疯狂”}
],
“乐器”:“萨克斯管”
},
{
“id”:2,
“姓名”:“桑尼·罗林斯”,
“专辑”:[
{“标题”:“萨克斯管巨像”},
{“标题”:“桥梁”},
{“标题”:“男高音疯狂”}
],
“乐器”:“萨克斯管”
}
];
让albums=[…api.reduce((结果,{albums})=>
albums.reduce((result,{title})=>result.add(title),result),
新集合()
)];
控制台日志(相册)代码>如果你的问题是你是否真的有其他方法来完成你已经在做的事情,那么这个问题更适合于询问可能重复的我不知道CodeReview!感谢您向我指出@Trincot如果您的问题真的是是否有其他方法来完成您已经在做的事情,那么这个问题更适合询问可能重复的我不知道CodeReview!感谢您向我指出@trincotI不知道Set()
。你的解决方案真的很优雅。谢谢我不知道Set()
。你的解决方案真的很优雅。谢谢