根据属性出现将数组拆分为新数组

时间:2014-03-24 20:32:09

标签: javascript jquery arrays json

我有一个对象数组,我想把它变成一个数组(或类数组)对象,其中键是给定属性的唯一值(类似于SQL group by)。

fiddle:

var obj = [
   {
      "ClaimId":"111",
      "DrugName":"AMBIEN CR",
      "PatientId":1571457415
   },
   {
      "ClaimId":"222",
      "DrugName":"AMBIEN CR",
      "PatientId":1571457415
   },
   {
      "ClaimId":"333",
      "DrugName":"LOTREL",
      "PatientId":1571457415
   },
   {
      "ClaimId":"444",
      "DrugName":"METHYLPREDNISOLONE",
      "PatientId":1571457415
   },
   {
      "ClaimId":"555",
      "DrugName":"CYMBALTA",
      "PatientId":1513895252
   },
   {
      "ClaimId":"666",
      "DrugName":"CYMBALTA",
      "PatientId":1513895252
   },
   {
      "ClaimId":"777",
      "DrugName":"CYMBALTA",
      "PatientId":1513895252
   },
   {
      "ClaimId":"888",
      "DrugName":"CYMBALTA",
      "PatientId":1513895252
   },
   {
      "ClaimId":"147503879TMQ",
      "DrugName":"CYMBALTA",
      "PatientId":1513895252
   },
   {
      "ClaimId":"999",
      "DrugName":"CYMBALTA",
      "PatientId":1513895252
   }
]
function splitBy(data, prop) {
        var returnObj = {};
        var returnArray = [];
        $.each(data, function (ix, val) {
            if (returnObj[val[prop]] === undefined) {
                returnObj[val[prop]] = [];
                returnObj[val[prop]].push(val);
            }


        });
        console.log(returnObj);
    }
splitBy(obj,'PatientId');

在小提琴中你可以看到我得到了我想要的数组键(PatientId属性中的两个唯一值),但我只得到第一个值。我明白这一点,因为一旦钥匙不再未定义,那么这个检查就不会运行,但我无法弄清楚如何做到这一点,这就像我得到的那样接近。如何在此集合上进行一次迭代?

2 个答案:

答案 0 :(得分:4)

  

我只得到第一个值。

那是因为你只推了第一个值 - 当没有钥匙时。

        if (returnObj[val[prop]] === undefined) {
            returnObj[val[prop]] = [];
            returnObj[val[prop]].push(val);
        }

        if (returnObj[val[prop]] === undefined) {
            returnObj[val[prop]] = [];
        }
        returnObj[val[prop]].push(val);

答案 1 :(得分:1)

jsFiddle Demo

你几乎拥有它,但是你忘记了密钥存在的其他条款

if (returnObj[val[prop]] === undefined) {
    returnObj[val[prop]] = [];
    returnObj[val[prop]].push(val);
}else{
    returnObj[val[prop]].push(val);
}