2017-01-06 10 views
4

у меня есть этот сценарий данных:Нормализовать отсутствующее значение в массиве объектов с 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, если только один из них имеет один.

Существует ли какой-то модуль узла, который может помочь в этом?

Или, может быть, существует какой-то умный способ сделать это?

ответ

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

он выглядит как средство для решения in-situ. –

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

+0

@vitto дайте мне знать свои мысли об этом, спасибо! – kukkuz