代码之家  ›  专栏  ›  技术社区  ›  delux

如何在JavaScript中使用映射键和按键分组值?

  •  0
  • delux  · 技术社区  · 6 年前

    最初,我的目标是:

    let root = {};
    root["myRootNode"] = { 
       id1: {
         age: "17",
         name: "name1",
         surname: "surname1"                    
      },
       id2: {
         age: "11",
         name: "name2",
         surname: "surname2"                    
      },
       id3: {
         age: "25",
         name: "name1",
         surname: "surname3"                    
      }
    };
    

    我想做的是让它进入状态:

    "name1": [
      {
         age: "17",
         surname: "surname1"         
      },
      {
         age: "25",
         surname: "surname3"         
      }
    ],
    "name2": [
        age: "11",
        surname: "surname2"        
    ]
    

    对我来说,让包含相同属性的所有对象的列表/数组按该属性的值分组是很重要的。

    我试过的(使用lodash)是:

    let test = _.mapKeys(root["myRootNode"], function(value, key) {
      return value["name"];
    });
    

    但这给了我一个结果:

    "name1": {
       age: "25"
       name: "name1"
       surname: "surname3"
    },
    "name2": {
       age: "11"
       name: "name2"
       surname: "surname2"
    }
    

    因此,它们没有分组,只有最后一个值映射到正在重复的键下。同样,在我得到的结果中,它们不在数组下。

    2 回复  |  直到 6 年前
        1
  •  1
  •   charlietfl    6 年前

    可以使用groupBy并映射它的值以除去 name 财产。

    如果你不介意离开 名称 属性可以简单地 _.groupBy(root.myRootNode, 'name');

    个人感觉你应该使用数组而不是对象

    const res =
    _(root.myRootNode)
      .groupBy('name')
      .mapValues((arr)=>_.map(arr, (o) =>_.omit(o,['name'])))
      .value()
    
    
    
    console.log(res)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
    
    <script>
    let root = {};
    root["myRootNode"] = { 
       id1: {
         age: "17",
         name: "name1",
         surname: "surname1"                    
      },
       id2: {
         age: "11",
         name: "name2",
         surname: "surname2"                    
      },
       id3: {
         age: "25",
         name: "name1",
         surname: "surname3"                    
      }
    };
    </script>
        2
  •  1
  •   ggorlen Hoàng Huy Khánh    6 年前

    给你一个机会。其思想是为每个新名称创建一个数组,并将所有条目推送到相应的名称数组中。

    const root = {
      myRootNode: {
        id1: {
          age: "17",
          name: "name1",
          surname: "surname1"
        },
        id2: {
          age: "11",
          name: "name2",
          surname: "surname2"
        },
        id3: {
          age: "25",
          name: "name1",
          surname: "surname3"
        }
      }
    };
    
    const result = Object.values(root.myRootNode).reduce((a, e) => {
      if (!(e.name in a)) {
        a[e.name] = [];
      }
    
      a[e.name].push({
        age: e.age,
        surname: e.surname
      });
    
      return a;
    }, {});
    
    console.log(JSON.stringify(result, null, 4));