问题
我有这样的数据:
- let objData = [{
- "product_client_id": 24,
- "product_type": "VIRTUAL"
- }, {
- "product_client_id": 24,
- "product_type": "VIRTUAL"
- }, {
- "product_client_id": 86,
- "product_type": "VIRTUAL"
- }, {
- "product_client_id": 86,
- "product_type": "PHYSIC"
- }, {
- "product_client_id": 24,
- "product_type": "PHYSIC"
- }];
复制代码
目标是在数组中搜索相同的重复对象,根据product_client_id和product_type过滤,从上面的数据中我想要输出如下
- [
- {
- "product_client_id": 24,
- "product_type": "VIRTUAL"
- }
- ]
复制代码
因为只有上面的数据按product_client_id和product_type和数组中的其他对象是一样的
回答
最直接的解决方案是遍历每个对象并检查是否存在“相似”对象。数组中的对象。
例如:
- let dupIdx = [];
- let final = objData.reduce(function(acc1, obj1, idx1) {
- // Don't look at objects already known as dups
- // This is so we don't introduce dups into the final result
- if (dupIdx.indexOf(idx1) === -1)
- let dups = objData.reduce(function (acc2, obj2, idx2) {
- // Same index or same property values.
- if (idx1 === idx2 ||
- (obj1.product_client_id === obj2.product_client_id &&
- obj1.product_type === obj2.product_type)) {
- acc2.push(idx2)
- }
- return acc2;
- }, []);
- if (dups.length > 1) {
- // Add new prop
- obj1.index = dups;
- acc1.push(obj1);
- // Update dup list
- dupIdx = dupIdx.concat(dups);
- }
- }
- return acc1;
- }, []);
复制代码
但是请注意,对于较大的数组,这将非常低效,因为它是 O(n^2)
|