如何使用下划线从对象数组中收集所有数组唯一值?

时间:2016-10-21 12:10:53

标签: javascript arrays underscore.js

我有一个对象数组。像

    project=[
        {
            name : "A"
            dept : ["a", "b", "c"]
        },
        {
            name : "B"
            dept : ["a", "e", "f", "g"]
        },
        {
            name : "C"
            dept : ["b", "c", "e", "j"]
        },
    ]

现在我想使用下划线从这个对象数组中收集dept的所有唯一数组值。 输出应保存在新数组中。像

var newArray = ["a", "b", "c", "e", "f", "g", "j"]

我是underscore.js的新手。提前谢谢。

7 个答案:

答案 0 :(得分:1)

这应该这样做:

_.uniq(_.flatten(project.map(x => x.dept)));

答案 1 :(得分:1)

您可以使用Setreduce()在纯js中执行此操作。



var project = [{
  name: "A",
  dept: ["a", "b", "c"]
}, {
  name: "B",
  dept: ["a", "e", "f", "g"]
}, {
  name: "C",
  dept: ["b", "c", "e", "j"]
}];

var result = [...new Set(project.reduce((r, e) => r.concat(e.dept), []))]
console.log(result)




答案 2 :(得分:1)

var project = [{
    name: "A",
    dept: ["a", "b", "c"]
}, {
    name: "B",
    dept: ["a", "e", "f", "g"]
}, {
    name: "C",
    dept: ["b", "c", "e", "j"]
}, ]



_UNIQUEAGEARRAY = _.flatten(project.map(function(item) {
    return item.dept
}));

console.log(_.uniq(_UNIQUEAGEARRAY));

document.body.innerHTML = JSON.stringify(_UNIQUEAGEARRAY);

小提琴:

http://jsfiddle.net/7k3ewb49/

答案 3 :(得分:1)

以下是使用下划线herepluckflatten的解决方案:

var result = _.chain(project)
    .pluck('dept')
    .flatten()
    .uniq()
    .value();



	  var  project=[
        {
            name : "A",
            dept : ["a", "b", "c"]
        },
        {
            name : "B",
            dept : ["a", "e", "f", "g"]
        },
        {
            name : "C",
            dept : ["b", "c", "e", "j"]
        },
    ]

    var result = _.chain(project)
    	.pluck('dept')
    	.flatten()
    	.uniq()
    	.value();
        
document.getElementById('result').textContent = JSON.stringify(result);

<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

<p>
  <pre id="result"></pre>
</p>
&#13;
&#13;
&#13;

答案 4 :(得分:0)

ES2015版本:

const newArray = project.reduce((res, {dept}) => 
    (dept.forEach(v => !res.some(r => r === v) && res.push(v)), res), []);

const newArray = [...new Set(Array.prototype.concat.apply([], project.map(({dept}) => dept)))]

答案 5 :(得分:0)

试试这个。

var projects = [{
  name: "A",
  dept: ["a", "b", "c"]
}, {
  name: "B",
  dept: ["a", "e", "f", "g"]
}, {
  name: "C",
  dept: ["b", "c", "e", "j"]
}]

var depts = [];

projects.map((project) => {
  depts = depts.concat(project.dept)
});

var result = depts.filter((item, pos) => depts.indexOf(item) == pos);

console.log(result);

答案 6 :(得分:0)

您可以使用spread syntax ...Set

var project = [{ name: "A", dept: ["a", "b", "c"] }, { name: "B", dept: ["a", "e", "f", "g"] }, { name: "C", dept: ["b", "c", "e", "j"] }];

var result = project.reduce((r, a) => [...new Set([...r, ...a.dept])], []);
console.log(result);