【问题标题】:Search for duplicate strings in array of objects in javascript在javascript中的对象数组中搜索重复的字符串
【发布时间】:2013-10-27 11:38:42
【问题描述】:
var names = [{id:1,name:"name1"}, {id:2,name:"name2"}, {id:3,name:"name1"}, {id:4,name:"name1"}, {id:5,name:"name2"}, {id:6,name:"name3"}]

这是我在 javascript 中的对象数组 - 我正在寻找一种方法来提取所有重复项和具有相同名称属性的个人 - 并将它们放入数组对象中。过滤掉重复的对象是我的当务之急。如果可能的话,在 jQuery 中这样做很好。

{
    [{id:1,name:"name1"},{id:3,name:"name1"}{id:4,name:"name1"}]
    [{id:2,name:"name2"},{id:5,name:"name2"}] 
    [{id:6,name:"name3"}]
}

【问题讨论】:

    标签: javascript string duplicates


    【解决方案1】:

    你可以这样做:

    var names = [{id:1,name:"name1"}, {id:2,name:"name2"}, {id:3,name:"name1"}, {id:4,name:"name1"}, {id:5,name:"name2"}, {id:6,name:"name3"}]
    
    var sorted = {};
    
    for (var i=0; i < names.length; i++) {
        if (!sorted[names[i].name]) {
            sorted[names[i].name] = [];
        }
        sorted[names[i].name].push(names[i]);
    }
    

    这是fiddle

    例如,如果您想要包含 name == "name1" 的所有项目的数组,您只需:

    var allName1s = sorted["name1"];
    

    【讨论】:

    • 当您不将其用作数组时,使用数组进行排序有点特殊。一个普通的对象会更合适。
    • @RoyJ:我不反对。我最初将它作为一个普通的对象,但这并不重要。您可以对数组使用非数字索引。我将它保留为一个数组,因为这就是 OP 所说的他们想要的。
    • 伟大的工作@MattBurland。我认为这与我正在寻找的内容很接近。
    • @RoyJ:进一步考虑,我认为我更喜欢使用普通对象,所以我把它换回来了。非数字数组索引对于length 之类的属性来说有点痛苦。
    • 感谢@RoyJ 的输入 - 我认为我同意将其作为对象而不是将其作为数组更有意义。
    【解决方案2】:

    如果您想将数据分类为有效和重复,我会这样做:

    Javascript:

    <script type="text/javascript">
    
    var names = [{id:1,name:"name1"}, {id:2,name:"name2"}, {id:3,name:"name1"}, {id:4,name:"name1"}, {id:5,name:"name2"}, {id:6,name:"name3"}]
    
    var parsed_names = parseNames(names);
    
    console.log(parsed_names);
    
    function parseNames(names) 
    {
        var parsed_data = [];
        var duplicate_data = [];
        var name_list = [];
        for (var i = 0; i < names.length; i++) {
            if (!inArray(names[i].name, name_list)) {
                parsed_data.push(names[i]);
            } else {
                duplicate_data.push(names[i]);
            }
            name_list.push(names[i].name);
        }
        return {
            'ParsedData': parsed_data,
            'DuplicateData': duplicate_data
        };
    }
    
    function inArray(needle, haystack) {
        for (var i = 0; i < haystack.length; i++) {
            if (haystack[i] === needle) {
                return true;
            }
        }
        return false;
    }
    
    </script>
    

    控制台输出(调试):

    【讨论】:

      【解决方案3】:

      Matt Burland 给出的方法是查找重复项的标准方法。我在这里使用它,但同时构建您正在寻找的数组数组。

      var names = [{id:1,name:"name1"}, {id:2,name:"name2"}, {id:3,name:"name1"}, {id:4,name:"name1"}, {id:5,name:"name2"}, {id:6,name:"name3"}]
      
      var collector = {};
      var sorted = [];
      for (var i = 0; i < names.length; ++i) {
          var entry = names[i];
          if (!(entry.name in collector)) {
              collector[entry.name] = [];
              sorted.push(collector[entry.name]);
          }
          collector[entry.name].push(entry);
      }
      console.dir(collector);
      console.dir(sorted);
      

      必备Fiddle

      【讨论】:

      • 感谢@RoyJ,这看起来很适合满足我的需求。
      猜你喜欢
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      相关资源
      最近更新 更多