2017-01-06 53 views
4

我有這樣的數據方案中丟失價值正常化對象的數組的NodeJS

var data = [ 
{ 
    'name': 'social-button', 
    'group': 'buttons' 
}, { 
    'name': 'social-button', 
    'group': 'buttons' 
}, { 
    'name': 'social-button', 
    'group': 'buttons' 
}, { 
    'name': 'social-button', 
    'group': 'buttons' 
}, { 
    'name': 'icon', 
    'group': 'icons' 
}, { 
    'name': 'other', 
    'group': null 
}, { 
    'name': 'icon', 
    'group': 'icons' 
} 
]; 

所以基本上,我想確保具有相同的所有元素name也應該具有相同的group,如果只有一個具有相同的元素。

確實存在一些節點模塊可以幫助嗎?

或者,也許存在一些聰明的方法來做到這一點?

回答

3

您可以使用兩個循環,一個用於收集哈希表中的值,另一個用於分配值。

var data = [{ 'name': 'social-button', 'group': null }, { 'name': 'social-button', 'group': null }, { 'name': 'social-button', 'group': 'buttons' }, { 'name': 'social-button', 'group': null }, { 'name': 'icon', 'group': 'icons' }, { 'name': 'other', 'group': null }, { 'name': 'icon', 'group': null }], 
 
    hash = Object.create(null); 
 

 
data.forEach(function (a) { 
 
    hash[a.name] = hash[a.name] || a.group; 
 
}); 
 

 
data.forEach(function (a) { 
 
    a.group = a.group || hash[a.name]; 
 
}); 
 

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

+0

你鍵入比我快:)雖然我打算使用'map'避免更改原件。 – OrangeDog

+0

它看起來像是一個原位解決方案。 –

+1

它工作完美,也沒有改變項目的順序,最後,它很容易閱讀,非常感謝 – vitto

0

,你可以先sort()您的數組,以便與組值的對象是第一位的,然後使用map()創建新的數組。您可以使用Object.assign()克隆對象,以便您不能更改原始數據。

var data = [{"name":"social-button","group":null},{"name":"social-button","group":null},{"name":"social-button","group":"buttons"},{"name":"social-button","group":null},{"name":"icon","group":"icons"},{"name":"other","group":null},{"name":"icon","group":null}] 
 

 
var result = data.sort((a, b) => b.group != null).map(function(o) { 
 
    if (!this[o.name]) { 
 
    this[o.name] = o.group 
 
    return o 
 
    } else { 
 
    var obj = Object.assign({}, o); 
 
    obj.group = this[o.name]; 
 
    return obj 
 
    } 
 
}, {}) 
 

 
console.log(result)

0

你可以做,在一個通使用Array.prototype.reducehash table - 看演示如下:

var data=[{'name':'social-button','group':null},{'name':'social-button','group':null},{'name':'social-button','group':'buttons'},{'name':'social-button','group':null},{'name':'icon','group':'icons'},{'name':'other','group':null},{'name':'icon','group':null}]; 
 

 
var result = data.reduce((function(hash){ 
 
    return function(p,c) { 
 
    hash[c.name] = hash[c.name] || c; 
 
    if(c.group) 
 
     hash[c.name].group = c.group; 
 
    p.push(hash[c.name]); 
 
    return p; 
 
    }; 
 
})(Object.create(null)), []); 
 

 
console.log(JSON.stringify(result));
.as-console-wrapper{top:0;max-height:100%!important;}

+0

@vitto讓我知道你的想法,謝謝! – kukkuz