首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在保持重复对象的前提下获得两个数组的区别

如何在保持重复对象的前提下获得两个数组的区别
EN

Stack Overflow用户
提问于 2017-04-04 16:59:38
回答 7查看 529关注 0票数 0

假设您有两个带有对象的数组,数组1Array 2。我遇到的问题是找到两个数组之间的确切的差异,其中可能包括看起来与每个数组相等的元素。在本例中,我注释了每个数组中的特定对象。

从购物车和重复物品的角度来考虑这一点,但是你只能赎回一件物品。因此,//number 4是重复的项目之一,但是在数组3中仍然需要它

阵列1

代码语言:javascript
运行
复制
[
  { // number 1
    item_id: 4,
    total_price: 2.71
  },
  { // number 2
    item_id: 2,
    total_price: 3.71
  },
  { // number 3
    item_id: 4,
    total_price: 1.71
  },
  { // number 4
    item_id: 4,
    total_price: 2.71
  }
]

阵列2

代码语言:javascript
运行
复制
[
  { // number 1
    item_id: 4,
    total_price: 2.71
  }
]

如何找到这两个数组,数组3之间的区别??是否最好在每个对象上都有一个唯一的键来比较容易呢?这是在javascript/节点中完成的,主要是使用lodash。

阵列3

代码语言:javascript
运行
复制
[
  { // number 2
    item_id: 2,
    total_price: 3.71
  },
  { // number 3
    item_id: 4,
    total_price: 1.71
  },
  { // number 4
    item_id: 4,
    total_price: 2.71
  }
]
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2017-04-05 00:03:45

这里有一个使用lodash#differenceWith的解决方案。

代码语言:javascript
运行
复制
function difference(arr1, arr2) {
  var found = {};
  return _.differenceWith(arr1, arr2, function(x, y) {
    var isDiff = _.isEqual(x, y) && !found[x.id];
    found[x.id] = true;
    return isDiff;
  });
}

代码语言:javascript
运行
复制
var array1 = [
  { // number 1
    item_id: 4,
    total_price: 2.71
  },
  { // number 2
    item_id: 2,
    total_price: 3.71
  },
  { // number 3
    item_id: 4,
    total_price: 1.71
  },
  { // number 4
    item_id: 4,
    total_price: 2.71
  }
];

var array2 = [
  { // number 1
    item_id: 4,
    total_price: 2.71
  }
];

function difference(arr1, arr2) {
  var found = {};
  return _.differenceWith(arr1, arr2, function(x, y) {
    var isDiff = _.isEqual(x, y) && !found[x.id];
    found[x.id] = true;
    return isDiff;
  });
}

console.log(difference(array1, array2));
代码语言:javascript
运行
复制
body > div { min-height: 100%; top: 0 }
代码语言:javascript
运行
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

票数 2
EN

Stack Overflow用户

发布于 2017-04-04 17:18:53

你可以用这样的方法来做这件事:

代码语言:javascript
运行
复制
array2.forEach(el => {
  let index = _.findIndex(array1, e => e.item_id === el.item_id);
  if (index >= 0) {
    array1.splice(index, 1);
  }
});

现在,您的array1将删除正确的值。如果您想保留原始的array1,那么先复制它,然后处理该副本:

代码语言:javascript
运行
复制
let array3 = _.clone(array1);
array2.forEach(el => {
  let index = _.findIndex(array3, e => e.item_id === el.item_id);
  if (index >= 0) {
    array3.splice(index, 1);
  }
});

现在您已经在array3中得到了结果。

票数 1
EN

Stack Overflow用户

发布于 2017-04-04 17:29:46

基本上你想从Array2中减去Array1?

有点丑,但效果很好:

代码语言:javascript
运行
复制
for(var i = 0; i < arrayA.length; i++) {
    var arrAElement = arrayA[i];

    arrayC.push(arrAElement);

    for(var j = 0; j < arrayB.length; j++) {
        var arrBElement = arrayB[j];

        if(arrAElement.item_id == arrBElement.item_id && 
           arrAElement.total_price == arrBElement.total_price) {
            arrayB.splice(j,1);
            arrayC.pop();
            break;
        }
    }
}

工作演示:https://jsfiddle.net/a0180jdf/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43213367

复制
相关文章

相似问题

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