使用nodejs

时间:2017-01-06 13:45:17

标签: javascript arrays node.js normalization

我有这个数据场景:

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,如果只有一个具有相同的<asp:TextBox ID="txtCustomer" runat="server"></asp:TextBox> <asp:AutoCompleteExtender ServiceMethod="SearchCustomers" MinimumPrefixLength="2" CompletionInterval="100" EnableCaching="false" CompletionSetCount="10" TargetControlID="txtCustomer" ID="AutoCompleteExtender1" runat="server" FirstRowSelected = "false" OnClientItemSelected = "ClientItemSelectedNewIssueCustomer"> </asp:AutoCompleteExtender>

是否存在一些节点模块可以帮助解决这个问题?

或许,确实存在一些聪明的方法吗?

3 个答案:

答案 0 :(得分:3)

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

&#13;
&#13;
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);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 1 :(得分: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)

答案 2 :(得分:0)

您可以使用Array.prototype.reducehash table一次通过中执行此操作 - 请参阅下面的演示:

&#13;
&#13;
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));
&#13;
.as-console-wrapper{top:0;max-height:100%!important;}
&#13;
&#13;
&#13;