使用_Underscore从嵌套对象创建值数组

时间:2017-06-21 18:53:16

标签: javascript underscore.js

我一直在努力解决这个问题。对于_Underscore JS来说还是比较新的,我试图从嵌套对象数组中创建一个唯一值数组。以下示例数据:

[  
   {  
      "property":"prop1",
      "list":[  
         {  
            "description":"description blah",
            "type":"F",
            "values":{  
               "value1":30.0,
               "value2":0.0
            }
         },
         {  
            "description":"description blah",
            "type":"F",
            "values":{  
               "value1":30.0,
               "value2":0.0
            }
         }
      ]
   },
   {  
      "property":"prop2",
      "list":[  
         {  
            "description":"description blah",
            "type":"Q",
            "values":{  
               "value1":30.0,
               "value2":0.0
            }
         }
      ]
   }
]

我试图获取的是一个包含所有UNIQUE嵌套“类型”值的数组。下面的数据示例:

["F","Q"]

我尝试_.pluck_.map但收效甚微。我是否需要利用不同的东西,例如链接它们?感谢我能得到的任何帮助。

3 个答案:

答案 0 :(得分:1)

这是一个使用链接的解决方案:

let result = _.chain(data)
    .pluck('list')
    .flatten()
    .pluck('type')
    .uniq()
    .value();

首先plucking数据中的列表和flattening个列表。然后,在最终调用uniq以获取唯一类型之前,从列表中获取类型。

答案 1 :(得分:0)

你可以做这个常规JS和reduce(对不起,我对下划线不太熟悉,所以我认为我现在提供一个香草解决方案)

var uniqueValues = data.reduce(function(vals, d) {
    return vals.concat(d.list.reduce(function(listVals, l) {
        if (vals.indexOf(l.type) === -1 && listVals.indexOf(l.type) === -1) {
            listVals.push(l.type)
        }

        return listVals;
    }, []))
}, [])

演示:https://jsfiddle.net/0dsdm7Lu/

答案 2 :(得分:0)

_.unique(_.flatten(_.map(myList, item => _.map(item.list, i => i.type))));

在编写函数时,Underscore并不是最好的,因为它首先需要数据。 lodash-fpramda在这方面要好得多。

工作小提琴:https://jsfiddle.net/8eLk7t15/