Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否有更好的方法将子级别阵列组合成单个阵列?_Javascript_Arrays - Fatal编程技术网

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()
。你的解决方案真的很优雅。谢谢