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

如何循环json数据并合并具有相同状态id的行?

  •  0
  • espresso_coffee  · 技术社区  · 7 年前

    我有美国参议员的.json文件,每个州有两名参议员。我想循环这个json文件,创建一个新的JS对象,该对象应该将stateID作为键,然后为每个键设置两个属性 name1 name2 . 以下是数据在原始文件中的外观示例:

    var senatorData = [{
        state_code: "AK",
        name: "Daniel Sullivan"
      },
      {
        state_code: "AK",
        name: "Lisa Murkowski"
      },
      {
        state_code: "WY",
        name: "Michael Enzi"
      },
      {
        state_code: "WY",
        name: "John Barrasso"
      }
    ];
    
    $(document).ready(function(){
      loadData();
    });
    
    function loadData() {
      if (senatorData) {
        for (var key in senatorData) {
          console.log(senatorData[key]);
        }
      }
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

    在示例中,我刚刚展示了原始数据,下面是我想要的:

    var senatorDataNew = [
        "AK" = {
             name1: "Daniel Sullivan",
             name2: "Lisa Murkowski"
         },
         "WY" = {
             name1: "Michael Enzi",
             name2: "John Barrasso"
         }
    ];
    

    名称1 属性的值,如果密钥已存在,则需要保留 姓名2

    3 回复  |  直到 7 年前
        1
  •  2
  •   Matt Grande    7 年前

    你在找这样的东西吗?

    senatorDataNew = {};    
    senatorData.forEach(senator => {
        if (! senatorDataNew[senator.state_code]) {
            senatorDataNew[senator.state_code] = {names: []};
        }
    
        senatorDataNew[senator.state_code].names.push(senator.name)
    });
    
        2
  •  2
  •   slider    7 年前

    如果只有两名参议员,你可以使用 reduce 设定 name1 name2 根据累加器中是否已存在密钥,在密钥旁边的对象中设置属性:

    function loadData() {
      if (senatorData) {
        return senatorData.reduce((a, {state_code, name}) => {
          if (state_code in a) a[state_code].name2 = name;
          else a[state_code] = {name1: name};
          return a;
        }, {});
      }
    }
    
    var senatorData = [{
        state_code: "AK",
        name: "Daniel Sullivan"
      },
      {
        state_code: "AK",
        name: "Lisa Murkowski"
      },
      {
        state_code: "WY",
        name: "Michael Enzi"
      },
      {
        state_code: "WY",
        name: "John Barrasso"
      }
    ];
    
    $(document).ready(function(){
      console.log(loadData());
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
        3
  •  1
  •   Taplar    7 年前

    var senatorData = [{
        state_code: "AK",
        name: "Daniel Sullivan"
      },
      {
        state_code: "AK",
        name: "Lisa Murkowski"
      },
      {
        state_code: "WY",
        name: "Michael Enzi"
      },
      {
        state_code: "WY",
        name: "John Barrasso"
      }
    ];
    
    //convert the object into an object of key (state) and value (names)
    senatorData = senatorData.reduce(function(results, senator){
      if (!results[senator.state_code]) results[senator.state_code] = [];
      
      results[ senator.state_code ].push(senator.name);
      return results;
    }, {});
    
    console.log(senatorData);
    
    //convert the object into an array of objects
    senatorData = Object.keys(senatorData).map(function(state){
      return { state_code: state, names: senatorData[state] };
    });
    
    console.log(senatorData);