Javascript:从嵌套的键值对读取键/值

Javascript:从嵌套的键值对读取键/值,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,我试图从嵌套的键/值Javascript对象将Category属性作为数组输出,如下所示 var data = [{key: "A", values:[{Category:"One", amount:2000}, {Category: "Two", amount:2500}, {Category: "Three", amount: 3000}, {Category: "Four", amount: 3000}] }, {key: "B", values:[{Categor

我试图从嵌套的键/值Javascript对象将Category属性作为数组输出,如下所示

var data = [{key: "A", values:[{Category:"One", amount:2000},
    {Category: "Two", amount:2500},
    {Category: "Three", amount: 3000},
    {Category: "Four", amount: 3000}]
},
{key: "B", values:[{Category:"One", amount:2000},
    {Category: "Two", amount:2500},
    {Category: "Three", amount: 3000},
    {Category: "Four", amount: 3000}]
},
{key: "C", values:[{Category:"One", amount:2000},
    {Category: "Two", amount:2500},
    {Category: "Three", amount: 3000},
    {Category: "Four", amount: 3000}]
}]  
预期产出如下:-

["One","Two","Three","Four"]  
我尝试了几种方法来实现这一点。 我最接近的是一个嵌套映射函数,如下所示。 下面的数据是包含上面Javascript对象的变量

x = data.map(function(el) {return el.values.map(function(ele,i){return 
ele.Category;})})  
但是输出仍然是一个数组数组,如下所示。我可以对此进行切片,然后只读取返回的一个数组,但我确信有更好的方法

[["One","Two","Three","Four"],["One","Two","Three","Four"],
["One","Two","Three","Four"]]  

如果您有任何建议,我们将不胜感激。

您可以首先展平返回的数组,然后使用Set删除所有重复的条目

var数据=[{key:A,值:[{Category:1,amount:2000},{Category:2,amount:2500},{Category:3,amount:3000},{Category:4,amount:3000}},{key:B,值:[{Category:1,amount:2000},{Category:2,amount 2500},{Category:3,amount 3000},{Category:4,amount 3000},{key:C,值:[{Category:1,Category:2000},{Category:2,amount 2500},{类别:三,金额:3000},{类别:四,金额:3000}]}, x=data.mapv=>v.values.mapc=>c.Category.reducea,b=>a.concatb, res=[…新Setx]; console.logres;我使用

变量数据=[{key:A,值:[{Category:One,amount:2000}, {类别:二,金额:2500}, {类别:三,金额:3000}, {类别:四,金额:3000}] }, {键:B,值:[{类别:一,金额:2000}, {类别:二,金额:2500}, {类别:三,金额:3000}, {类别:四,金额:3000}] }, {键:C,值:[{类别:一,金额:2000}, {类别:二,金额:2500}, {类别:三,金额:3000}, {类别:四,金额:3000}] } ]; var ans=数据还原函数ACC,el{ 返回acc.concatel.values.mapx=>x.类别; }, [] var result=[…新设置]
console.logresult;这里有一种不太神秘的方法。您的设置有点有趣,因为存在重复项,并且您似乎希望消除重复项。ES6集非常适合这样做。这将为您提供所需的结果

让数据=[{key:A,值:[{Category:1,amount:2000},{Category:2,amount:2500},{Category:3,amount:3000},{Category:4,amount:3000}},{key:B,值:[{Category:1,amount:2000},{Category:2,amount 2500},{Category:3,amount 3000},{Category:4,amount 3000},{key:C,值:[{Category:1,Category:2000},{Category:2,amount 2500},{类别:三,金额:3000},{类别:四,金额:3000}]}, 集合=新集合; data.forEachval=>{ 设v=val.values.forEach x=>{ set.addx.Category; }; };
console.logArray.fromset;x=x[0]会做什么?x[0]=[1,2,3,4]@jrook是的,在这种情况下,我最终得到了前面提到的数组数组。x=x[0]这是我唯一的选择。但我正在尝试以更高效的方式找到答案。在我有很多键的情况下。我可能会创建一个非常大的数组,但我并不需要。这是一个非常好的解决方案,如果你能提供一个工作段,+1会更好。不确定你的意思,代码工作得很好,我测试过了。后来啊,我明白了,你的意思是实际设置这些代码片段中的一个。嗯,这对我来说太新了。很好的复制粘贴,这很好。这个答案和上面来自@Kinduser的答案都在我掌握的Javascript的平衡中,教我一些新的东西。很高兴能帮助我。这些东西成为第二天性过了一段时间。除此之外,你还可以考虑递归,但现实是,递归主要在面试中有用。在20多年的前端开发中,我认为我可以计算出用JS编写递归ALG的实际需要,并且仍然拿着一把吉他。谢谢。这正是我想要的。@rkadam谢谢,我同意猜一猜。:我正要做那件事-
var data = [
    {
        key: "A",
        values: [
            {Category: "One",   amount: 2000},
            {Category: "Two",   amount: 2500},
            {Category: "Three", amount: 3000},
            {Category: "Four",  amount: 3000}
        ]
    },
    ...
];

var categories =
  _.unique(
    _.flatten(
      _.map(data, function (item) {
        return _.pluck(item.values, 'Category');
      })
    )
  );