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

4

我有一组对象,想将其转换为一个数组(或类似数组的对象),其中键是该属性的唯一值(类似于SQL的group by)。

示例代码:

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属性中的两个唯一值),但是我只获取了第一个值。我知道这是因为一旦键不再是undefined,那么这个检查就不会运行了,但我无法弄清楚如何做到这一点,这是我所能接近的。如何在遍历此集合时只使用一次迭代来实现这一点?
2个回答

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);

几分钟的搜索后,我发现这正是我试图使用三元逻辑来做的事情,如果 val[prop] === something something.. 在这里,你只需将它推到正确的键上,因为正在迭代的就是正确的键。谢谢 :) - wootscootinboogie

1

jsFiddle演示

你差点就成功了,但是你忘记了当键存在时的else语句。

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

不,使用else和一个空数组文字会忽略第一次出现。 - Bergi
1
使用else语句会导致代码中有两行完全相同的内容;实际上这不应该出现在if语句块中,因为你需要让它每次都执行。 - Evan Davis
@Bergi - 在你的版本中会这样。但不适用于原始帖子的代码。你的评论与此无关。 - Travis J
@Mathletics - 这是真的,else并不像包含push一样必要,它更多的是一个可读性问题。然而,在不重构op的代码的情况下,它是必需的。 - Travis J
@TravisJ:没有整个代码(也没有查看你的fiddle)的情况下,我最初认为你会建议在现有的“push”语句之前插入一个“else”。我没想到你会复制这一行 :-) - Bergi
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接