用nodejs标准化对象数组中的缺失值

我有这个数据场景:

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 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 ,如果只有一个具有相同的name

是否存在一些节点模块可以帮助在这?

或者,也许存在一些聪明的方式来做到这一点?

您可以使用两个循环,一个用于收集哈希表中的值,另一个用于赋值。

 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; } 

你可以先sort()你的数组,所以带有组值的对象先来,然后使用map()来创build新的数组。 您可以使用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) 

你可以通过使用Array.prototype.reduce和一个hash 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;}