如何将对象的属性值提取到数组中并使数组中的元素不同?

时间:2017-03-23 10:07:32

标签: javascript

我有这个数组

var data = [
    {F: 'a', T: 'z', V:1},
    {F: 'b', T: 'z', V:2},
    {F: 'c', T: 'z', V:3}
]

我希望下面有这个数组 我使用了方法forEach

 var nodes = [];
 data.forEach(function(element) {
   nodes.push({name:element.F})
   nodes.push({name:element.T}            
 })

但在数组中有一个重复元素{name:' z'}但不想要重复元素,我想要下面的数组

[
    {name:'a'},
    {name:'b'},
    {name:'c'},
    {name:'z'},
]

4 个答案:

答案 0 :(得分:0)

您可以先创建新的Set,然后添加FT的值,然后将该值转换为数组并使用map()

var data = [{F: 'a', T: 'z', V:1},{F: 'b', T: 'z', V:2},{F: 'c', T: 'z', V:3}]

var set = new Set()
data.forEach(function(e) {
  if(e.F) set.add(e.F)
  if(e.T) set.add(e.T)
})

var result = [...set].map(e => ({name: e}))
console.log(result)

答案 1 :(得分:0)

您可以使用哈希表,只推送不在哈希表中的值。



.as-console-wrapper { max-height: 100% !important; top: 0; }

{{1}}




答案 2 :(得分:0)

使用Array.prototype.reduce()Array.prototype.indexOf()函数的解决方案:

var data = [{F: 'a', T: 'z', V:1}, {F: 'b', T: 'z', V:2}, {F: 'c', T: 'z', V:3}],

    result = data.reduce(function (a, o) {  // getting an array of unique values
        if (a.indexOf(o.F) === -1) a.push(o.F);
        if (a.indexOf(o.T) === -1) a.push(o.T);
        return a;
    }, [])
        .map(function (v) { return {name: v}; });

console.log(result);

答案 3 :(得分:0)

或使用唯一键对象功能(仅当初始对象值(此处为数据)是可串行的时)(如果在代码中为no):



var data = [{ F: 'a', T: 'z', V: 1 }, { F: 'b', T: 'z', V: 2 }, { F: 'c', T: 'z', V: 3 }];

var result = Object.keys(
    data.reduce( (memo, el) => { 
        memo[el.F] = undefined; 
        memo[el.T] = undefined; 
        return memo; 
    }, {})
).reduce( (memo, el) => { 
    memo.push({name: el}); 
    return memo; 
}, []);

console.log(result)