【问题标题】:Converting array of objects into nested form将对象数组转换为嵌套形式
【发布时间】:2016-11-07 15:39:17
【问题描述】:

我有一个这种形式的对象数组

nnz=[{

    "verb":"has",

     "nouns": "employees"
   },

   {

     "verb":"has",
     "nouns": "managers"
   },

    {

    "verb":"have",
     "nouns": "departments"
   }
]

但我想把它转换成这种形式

[ {

     "verb":"has",
     "nouns": ["employees",  "managers"]
   },

   {
    "verb":"have",
    nouns:["departments"]
  }
]

而且这项工作必须从客户端完成。我在 node.js 工作。我想允许用户针对每个动词选择多个名词,并且当用户针对动词选择名词时,它应该以上述给定形式保存到数组中。我无法弄清楚如何实现这个逻辑。

更新:我们也必须检查动词。现在它变得更加棘手了。

【问题讨论】:

    标签: angularjs node.js mongodb


    【解决方案1】:

    你可以这样做,使用一些 Array 内置函数:

    const array = [
    
      {
    
        "verb":"has",
    
         "nouns": "employees"
       },
    
       {
    
         "verb":"has",
         "nouns": "managers"
       },
    
        {
    
        "verb":"has",
         "nouns": "departments"
       }
    ]
    
    const aggregated = array.reduce( (arr, el) =>{
      let found = arr.find(ll => ll.verb == el.verb);
      if(found) found.nouns.push(el.nouns);
      else arr.push({verb : el.verb, nouns : [el.nouns] })
      return arr;
    }, []);
    console.log(aggregated);

    【讨论】:

      【解决方案2】:

      首先创建一个使用动词值作为键的临时对象,然后迭代现有数据,将名词推送到该临时对象中的相应数组。

      然后将临时对象映射到一个新数组。

      nnz = [{
        "verb": "has",
        "nouns": "employees"
      }, {
        "verb": "has",
        "nouns": "managers"
      }, {
        "verb": "has",
        "nouns": "departments"
      }]
      
      var tmp = {};
      nnz.forEach(function(item) {
        tmp[item.verb] = tmp[item.verb] || {
          verb: item.verb,
          nouns: []
        };
        tmp[item.verb].nouns.push(item.nouns);
      });
      
      var results = Object.keys(tmp).map(function(key) {
        return tmp[key];
      });
      
      console.log(results);

      【讨论】:

        【解决方案3】:

        根据您的要求尝试这两种方法。我希望它能按预期工作

        第一种方法:

        当您知道属性名称时:

        var nnz = [{
        "verb":"has",
         "nouns": "employees"
           },
           {
         "verb":"has",
         "nouns": "managers"
           },
        {
        "verb":"has",
         "nouns": "departments"
           }
        ];
        
        var newObj = {};
        var nouns = [];
        for (var i in nnz) {
        nouns.push(nnz[i].nouns);
        newObj.verb = nnz[i].verb;
        newObj.nouns = nouns;
        }
          
        nnz = newObj;
        
        console.log(nnz);

        第二种方法:

        当您不知道属性名称时:

        var nnz = [{
            "verb":"has",
             "nouns": "employees"
           },
           {
             "verb":"has",
             "nouns": "managers"
           },
            {
            "verb":"has",
             "nouns": "departments"
           }
        ];
        
        var newObj = {};
        var nounsArr = [];
        for (var i in nnz) {
        nounsArr.push(nnz[i][Object.keys(nnz[i])[1]])
        nnz[i][Object.keys(nnz[i])[1]] = nounsArr;
        var Objlen = Object.keys(nnz[i]).length;
        for (var j=0;j<Objlen;j++) {
        var objKeys = Object.keys(nnz[i])[j];
        newObj[objKeys] = nnz[i][objKeys];
        }
        }
        
        nnz = newObj;
        
        console.log(nnz);

        【讨论】:

          猜你喜欢
          • 2015-03-26
          • 2019-01-31
          • 1970-01-01
          相关资源
          最近更新 更多