来自Array的Object中的Concat数组

时间:2016-12-08 13:35:23

标签: javascript

我目前正在尝试检索存储为数组的元数据列表,在对象内部,在数组内部。这是一个更好的解释性示例:

[
    {
        name: 'test',
        metadata: [
            {
                name: 'Author',
                value: 'foo'
            },
            {
                name: 'Creator',
                value: 'foo'
            }
        ]
    },
    {
        name: 'otherTest',
        metadata: [
            {
                name: 'Created',
                value: 'foo'
            },
            {
                name: 'Date',
                value: 'foo'
            }
        ]
    },
    {
        name: 'finalTest'
    }
]

现在,我的目标是在没有冗余的情况下检索元数据列表(按名称)。我认为.map()是成功的关键,但我无法在短时间内找到如何做到这一点,实际上我的代码是2 for和3 if,而且我觉得这样做很脏。

预期输入为:['Author', 'Creator', 'Created', 'Date']

我在Typescript中开发,如果这对某些功能有帮助的话。

3 个答案:

答案 0 :(得分:3)

您可以使用reduce()然后使用map()返回名称数组。

var data = [{"name":"test","metadata":[{"name":"Author","value":"foo"},{"name":"Creator","value":"foo"}]},{"name":"otherTest","metadata":[{"name":"Created","value":"foo"},{"name":"Date","value":"foo"}]},{"name":"finalTest"}]

var result = [...new Set(data.reduce(function(r, o) {
  if (o.metadata) r = r.concat(o.metadata.map(e => e.name))
  return r
}, []))];


console.log(result)

答案 1 :(得分:1)

var data = [{"name":"test","metadata":[{"name":"Author","value":"foo"},{"name":"Creator","value":"foo"}]},{"name":"otherTest","metadata":[{"name":"Created","value":"foo"},{"name":"Date","value":"foo"}]},{"name":"finalTest"}]

data
.filter(function(obj){return obj.metadata != undefined})
.map(function(obj){return obj.metadata})
.reduce(function(a,b){return a.concat(b)},[])
.map(function(obj){return obj.name})

答案 2 :(得分:1)

一对一Array.prototype.reduce()Array.prototype.map()应该按照以下方式执行;



var arr = [
    {
        name: 'test',
        metadata: [
            {
                name: 'Author',
                value: 'foo'
            },
            {
                name: 'Creator',
                value: 'foo'
            }
        ]
    },
    {
        name: 'otherTest',
        metadata: [
            {
                name: 'Created',
                value: 'foo'
            },
            {
                name: 'Date',
                value: 'foo'
            }
        ]
    },
    {
        name: 'finalTest'
    }
];

result = arr.reduce((p,c) => c.metadata ? p.concat(c.metadata.map(e => e.name))
                                        : p, []);
console.log(result);