使用 nodejs 规范化对象数组中的缺失值
Normalize missing value inside an array of objects with 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
,如果只有一个相同的元素有一个。
是否存在一些节点模块可以帮助解决这个问题?
或者,是否存在一些聪明的方法来做到这一点?
您可以使用两个循环,一个用于在哈希 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 }],
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()
创建新数组。您可以使用 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;}
我有这样的数据场景:
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
,如果只有一个相同的元素有一个。
是否存在一些节点模块可以帮助解决这个问题?
或者,是否存在一些聪明的方法来做到这一点?
您可以使用两个循环,一个用于在哈希 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 }],
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()
创建新数组。您可以使用 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;}