【问题标题】:Normalize missing value inside an array of objects with nodejs使用nodejs规范化对象数组中的缺失值
【发布时间】:2017-05-21 07:08:56
【问题描述】:

我有这个数据场景:

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,如果只有一个相同的元素有一个。

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

或者,是否存在一些聪明的方法来做到这一点?

【问题讨论】:

    标签: javascript arrays node.js normalization


    【解决方案1】:

    您可以使用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;}

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 你打字比我快 :) 虽然我打算使用 map 来避免更改原件。
      • 它看起来像是在寻找原位解决方案。
      • 完美运行,也没有改变项目的顺序,最后,非常容易阅读,非常感谢
      【解决方案3】:

      你可以先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)

      【讨论】:

        猜你喜欢
        • 2019-10-03
        • 2018-11-26
        • 2021-05-31
        • 2020-05-04
        • 2015-09-20
        • 1970-01-01
        • 2017-06-15
        • 2021-01-20
        • 1970-01-01
        相关资源
        最近更新 更多