【问题标题】:How to make a JSON array unique [duplicate]如何使 JSON 数组唯一 [重复]
【发布时间】:2012-08-06 10:14:29
【问题描述】:

可能重复:
Array unique values
Get unique results from JSON array using jQuery

我有一个这样的 JSON 字符串

[
 Object { id="38",product="foo"},
 Object { id="38",product="foo"},
 Object { id="38",product="foo"},
 Object { id="39",product="bar"},
 Object { id="40",product="hello"},
 Object { id="40",product="hello"}

]

这个 JSON 数组中有重复的值。我怎样才能让这个 JSON 数组像这样独一无二

[
 Object { id="38",product="foo"},
 Object { id="39",product="bar"},
 Object { id="40",product="hello"}
]

.我正在寻找使用较少迭代的建议, Jquery $.inArray 在这种情况下不起作用。

欢迎使用任何第三方库的建议。

【问题讨论】:

  • 您要删除具有相同 ID/产品组合的元素还是仅具有相同 ID 的元素?
  • 最有效的方法是将数组转换为以元素为键的散列。然后将哈希变成一个数组。应该给你O(n)
  • 其实这和 JSON 一点关系都没有;)
  • 那么你是怎么做到的@TorstenWalter ..欢迎任何想法:)
  • 我已经在下面回答了:) 我指的是标签JSONarray 是来自 JSON 字符串,是手动输入还是由 JavaScript 代码生成与预期任务无关,即过滤数组以使其仅包含不同的值。我不是要抨击,只是尝试教育。

标签: javascript jquery arrays json dojo


【解决方案1】:

您可以使用underscore's uniq

在您的情况下,您需要提供一个迭代器来提取“id”:

array = _.uniq(array, true /* array already sorted */, function(item) {
  return item.id;
});

【讨论】:

    【解决方案2】:

    // Assuming first that you had **_valid json_**
    myList= [
        { "id":"38","product":"foo"},
        { "id":"38","product":"foo"},
        { "id":"38","product":"foo"},
        { "id":"39","product":"bar"},
        { "id":"40","product":"hello"},
        { "id":"40","product":"hello"}
    ];
    
    // What you're essentially attempting to do is turn this **list of objects** into a **dictionary**.
    var newDict = {}
    
    for(var i=0; i<myList.length; i++) {
        newDict[myList[i]['id']] = myList[i]['product'];
    }
    
    // `newDict` is now:
    console.log(newDict);

    【讨论】:

    • 如果您需要键值对中的数据,这很好。但是,如果您需要原样的密钥,例如模板,这不是最佳解决方案。
    【解决方案3】:

    检查以下 SO 问题中的解决方案:

    Get unique results from JSON array using jQuery

    您必须遍历您的数组并创建一个包含唯一值的新数组。

    【讨论】:

      【解决方案4】:

      您可能必须循环删除重复项。如果存储的项目如您所建议的那样有序,则只需一个循环即可:

      function removeDuplicates(arrayIn) {
          var arrayOut = [];
          for (var a=0; a < arrayIn.length; a++) {
              if (arrayOut[arrayOut.length-1] != arrayIn[a]) {
                  arrayOut.push(arrayIn[a]);
              }
          }
          return arrayOut;
      }
      

      【讨论】:

        【解决方案5】:

        您可以轻松地自己编写代码。 从我的脑海中浮现出来。

        var filtered = $.map(originalArray, function(item) {
            if (filtered.indexOf(item) <= 0) {
                return item;
            }
        });
        

        或者如建议的更有效的算法,专门针对手头的情况:

        var helper = {};
        var filtered = $.map(originalArray, function(val) {
            var id = val.id;
        
            if (!filtered[id]) {
                helper[id] = val;
                return val;
            }
        });
        helper = null;
        

        【讨论】:

        • 效率很低。在最坏的情况下O(n^2).
        • 如果返回的数据确实有id,那么当然是带有id键的hash map是最有效的。
        • +1:没错。如果 OP 想要一个数组,那么他可以轻松地将 filtered 转换为数组。这个解决方案在计算复杂度方面应该是O(n),尽管它使用了至少两倍的内存。不过应该不成问题(谁会把这么大的 JSON 发送到客户端?)。
        • 内存不应过多,因为对象和数组只包含对相同对象的引用。
        猜你喜欢
        • 1970-01-01
        • 2012-06-30
        • 2013-12-07
        • 1970-01-01
        • 1970-01-01
        • 2012-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多