【问题标题】:Split array into new array based on property occurences根据属性出现将数组拆分为新数组
【发布时间】:2014-05-02 10:24:45
【问题描述】:

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

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 属性中的两个唯一值),但我只得到第一个值。我知道这是因为一旦密钥不再未定义,则不会运行此检查,但我不知道该怎么做,这与我得到的一样接近。如何通过对这个集合的一次迭代来做到这一点?

【问题讨论】:

    标签: javascript jquery arrays json


    【解决方案1】:

    我只得到第一个值。

    那是因为您只按下第一个值 - 当没有键时。改变

            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..here,你只需将它推到正确的键上,这正是我试图用三元逻辑做的因为正确的密钥是被迭代的内容。谢谢:)
    【解决方案2】:

    jsFiddle Demo

    您几乎拥有它,但是一旦密钥存在,您就忘记了 else 子句

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

    【讨论】:

    • 不,使用else 和空数组文字会忽略第一次出现。
    • 使用else 你有两次相同的行;它根本不应该在if 中,因为您希望它每次都运行。
    • @Bergi 一开始我以为你错了,但是......当我意识到我的新数组只有 8 个元素时我错了:(
    • @Bergi - 在你的版本中它会。但不在 OP 的代码中。您的评论不相关。
    • @Mathletics - 没错,else 本质上并不像包含push 那样需要,它更多的是可读性问题。但是,如果不重构 op 的代码,它是必需的。
    猜你喜欢
    • 2022-10-30
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2014-08-14
    • 2018-10-07
    • 2022-01-18
    相关资源
    最近更新 更多