簡體   English   中英

按 JSON 鍵對對象列表進行分組

[英]Group list of objects by JSON key

我正在嘗試通過在 javascript 中對某個密鑰對進行分組來重新格式化我的對象列表。

數據格式

[{
    "sccode": "sccode1",
    "val": "1ADA"
}, {
    "sccode": "sccode2",
    "val": "1ADB"
}, {
    "sccode": "sccode1",
    "val": "1ADC"
}]

預期結果

[{
        "scCode": "sccode1",
        "valCodes": ["1ADA", "1ADC"]
    }, 
{
        "scCode": "sccode2",
        "valCodes": ["1ADB"]
    }

]

我相信我可以遍歷數組並匹配我的鍵,但是有沒有一種快速的方法來重新格式化它而不必顯式遍歷? 我試過使用下面的 reduce 函數,但它在 find 中給出了未定義的錯誤,我認為這與我的格式有關。

嘗試(?)代碼

 const resp = data.reduce((acc, ele) => {
          const ant = acc.find(x => x.sccode === ele.sccode);
        }, []);

這行嗎?

 const src = [{"sccode":"sccode1","val":"1ADA"},{"sccode":"sccode2","val":"1ADB"},{"sccode":"sccode1","val":"1ADC"}], result = src.reduce((r,{sccode,val}) => { const match = r.find(({scCode}) => scCode == sccode) match ? match.valCodes.push(val) : r.push({scCode:sccode, valCodes: [val]}) return r }, []) console.log(result)
 .as-console-wrapper{min-height:100%;}

嘗試以下操作,我使用映射來存儲部分狀態以提高性能,從而防止在數組中為每個初始對象搜索 sccode。

let partial = [{
  "sccode": "sccode1",
  "val": "1ADA"
}, {
  "sccode": "sccode2",
  "val": "1ADB"
}, {
  "sccode": "sccode1",
  "val": "1ADC"
}].reduce((map, obj) => {
  if (!map[obj.sccode]) {
    map[obj.sccode] = [obj.val];
  } else {
    map[obj.sccode].push(obj.val);
  }
  return map;
}, {})

Object.keys(partial).map(sccode => ({
  sccode, valCodes: partial[sccode]
}));

試試 loaddash/groupby

let groupByResult = groupBy(data, function (n) {
          return n.sccode
        });

檢查此代碼:

    array.reduce(function(res, value){
        if(!res[value.sccode]) {
            res[value.sccode] = value; 
            res[value.sccode]['valCodes'] = []
            result.push(res[value.sccode]);
        }
        res[value.sccode]['valCodes'].push(value.val); 
        return res; 
    } ,{}); 

我在這里測試過,效果很好!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM