首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >收集JavaScript数组中的唯一对象

收集JavaScript数组中的唯一对象
EN

Stack Overflow用户
提问于 2016-03-31 22:33:11
回答 4查看 16.4K关注 0票数 6

假设我有以下对象数组

代码语言:javascript
复制
var firstDataSet = [
  {'id': 123, 'name': 'ABC'},
  {'id': 456, 'name': 'DEF'},
  {'id': 789, 'name': 'GHI'},
  {'id': 101, 'name': 'JKL'}
];

var secondDataSet = [
  {'id': 123, 'name': 'ABC', 'xProp': '1q'},
  {'id': 156, 'name': 'MNO', 'xProp': '2w'},
  {'id': 789, 'name': 'GHI', 'xProp': '3e'},
  {'id': 111, 'name': 'PQR', 'xProp': '4r'}
];

现在我想收集具有唯一对象的数组(匹配idname),即

代码语言:javascript
复制
var firstDataSet = [
  {'id': 123, 'name': 'ABC', 'xProp': '1q'},
  {'id': 456, 'name': 'DEF'},
  {'id': 789, 'name': 'GHI', 'xProp': '3e'},
  {'id': 101, 'name': 'JKL'},
  {'id': 156, 'name': 'MNO', 'xProp': '2w'},
  {'id': 111, 'name': 'PQR', 'xProp': '4r'}
];

我可以收集所有的

代码语言:javascript
复制
Array.prototype.unshift.apply(firstDataSet , secondDataSet );

但不知道我怎么过滤掉重复的。有什么建议吗?

编辑:我的对象在两个不同的数组上是不一样的。至少基于属性的数量。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-03-31 22:37:50

删除具有所有相同属性的重复项

这是最初的问题。

使用Set

Set对象允许存储任何类型的唯一值,无论是原始值还是对象引用。

还可以使用对象文本。

代码语言:javascript
复制
var list = [JSON.stringify({id: 123, 'name': 'ABC'}), JSON.stringify({id: 123, 'name': 'ABC'})]; 
var unique_list = new Set(list); // returns Set {"{'id': 123, 'name': 'ABC'}"}
var list = Array.from(unique_list); // converts back to an array, and you can unstringify the results accordingly.

有关将集合构造回数组的更多方法,可以按照这里指令进行操作。如果您不能使用ES6 (这就是定义Set的方法),那么就会为旧的浏览器提供聚脂填充

删除具有属性的重复子集的对象

不幸的是,这些对象不再是严格重复的,不能以友好的方式使用Set来处理。

解决这类问题的最简单方法是迭代对象数组,识别具有重复属性值的对象,并使用splice消除这些问题。

票数 10
EN

Stack Overflow用户

发布于 2019-12-10 05:10:43

这可以通过像下面这样扩展Set类来实现

代码语言:javascript
复制
    var firstDataSet = [
      {'id': 123, 'name': 'ABC'},
      {'id': 456, 'name': 'DEF'},
      {'id': 789, 'name': 'GHI'},
      {'id': 101, 'name': 'JKL'}
    ];

    var secondDataSet = [
      {'id': 123, 'name': 'ABC', 'xProp': '1q'},
      {'id': 156, 'name': 'MNO', 'xProp': '2w'},
      {'id': 789, 'name': 'GHI', 'xProp': '3e'},
      {'id': 111, 'name': 'PQR', 'xProp': '4r'}
    ];

    Array.prototype.unshift.apply(firstDataSet , secondDataSet );

    //console.log(firstDataSet)

    class UniqueSet extends Set {
            constructor(values) {
                super(values);

                const data = [];
                for (let value of this) {
                    if (data.includes(JSON.parse(value.id))) {
                        this.delete(value);
                    } else {
                        data.push(value.id);
                    }
                }
            }
          }

console.log(new UniqueSet(firstDataSet))

工作链接

票数 1
EN

Stack Overflow用户

发布于 2016-04-01 02:33:06

这可能不是最有效的解决方案,但假设id总是唯一的,它应该可以工作。

代码语言:javascript
复制
var firstDataSet = [
  {'id': 123, 'name': 'ABC'},
  {'id': 456, 'name': 'DEF'},
  {'id': 789, 'name': 'GHI'},
  {'id': 101, 'name': 'JKL'}
];

var secondDataSet = [
  {'id': 123, 'name': 'ABC', 'xProp': '1q'},
  {'id': 156, 'name': 'MNO', 'xProp': '2w'},
  {'id': 789, 'name': 'GHI', 'xProp': '3e'},
  {'id': 111, 'name': 'PQR', 'xProp': '4r'}
];

Array.prototype.unique = function() {
    var o = {}, i, l = this.length, r = [];
    for(i=0; i<l;i+=1) o[this[i]] = this[i];
    for(i in o) r.push(o[i]);
    return r;
};

function concatUnique(a, b, property) {
    var arr = a.concat(b);
    arr.sort(function(a,b) { 
        return Object.keys(b).length - Object.keys(a).length; 
    });
    var ids = arr.map(function(obj){ return obj[property] }).unique();

    return arr.filter(function(obj) { 
        if(ids.indexOf(obj[property]) > -1) { 
            ids.splice( ids.indexOf(obj[property]) , 1); 
            return true; 
        } else { 
            return false 
        }
    });
}

var newArray = concatUnique(firstDataSet, secondDataSet, 'id');
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36344976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档