js中,删除arr1中比arr2中多的对象之filter、find & 数组中是否有相同对象之every、some & 删除数组中不是相同的对象 & 对象数组,去重后合并

js中,删除arr1中比arr2中多的对象之filter、find & 数组中是否有相同对象之every、some & 删除数组中不是相同的对象 & 对象数组,去重后合并

1、场景1-删除arr1中比arr2中多的对象

删除arr1中比arr2中多的对象

let arr1 = [
{ classify: "1", workerCode: 15 },
{ classify: "1", workerCode: 16 },
{ classify: "1", workerCode: 17}
];

let arr2 = [
{ classify: "1", workerCode: 15},
{ classify: "1", workerCode: 16 },
];

//可以使用JavaScript的Array.filter()方法结合一些条件判断来实现删除arr1中比arr2中多的对象的操作。
arr1 = arr1.filter(obj1 => {
  // 判断arr2中是否存在与obj1相同的对象
  const foundObj2 = arr2.find(obj2 => obj2.workerCode === obj1.workerCode);
  // 如果存在相同的对象,保留obj1
  if (foundObj2) {
    return true;
  }
  // 如果不存在相同的对象,删除obj1
  else {
    return false;
  }
});

上述代码中,Array.filter()方法会遍历arr1中的每个对象,并将其传递给回调函数obj1 => {…}。在回调函数中,我们首先使用Array.find()方法在arr2中查找是否存在与obj1相同的对象,将其赋值给foundObj2。如果存在相同的对象,说明obj1在arr2中也存在,应该保留在arr1中,因此返回true。如果不存在相同的对象,说明obj1在arr2中不存在,应该被删除,因此返回false。最终,Array.filter()方法会返回一个新的数组,其中仅包含arr1和arr2中相同的对象。

值得注意的是,上述代码中的条件判断仅基于workerCode属性进行,因为这是arr1和arr2中对象唯一的区分标识。如果两个数组中的对象可能存在其他属性值不同的情况,需要根据实际情况进行扩展判断。

2、场景2-数组中是否有相同对象

数组中是否有相同对象

let arr1 = [
{ classify: "1", workerCode: 15 },
{ classify: "1", workerCode: 16 },
{ classify: "1", workerCode: 17}
];

let arr2 = [
{ classify: "1", workerCode: 15},
{ classify: "1", workerCode: 16 },
];

arr2中的每个对象在arr1中都存在相同的对象,因为它们具有相同的workerCode属性值。

数组中的对象相等通常需要满足所有属性的值都相等,或者满足某些特定的相等条件。在这个问题中,我们假设两个对象相等当且仅当它们的workerCode属性值相等。因此,我们可以使用JavaScript的Array.every()方法和Array.some()方法来判断arr2中的每个对象是否在arr1中都存在相同的对象。

const isSubset = arr2.every(obj2 => {
  return arr1.some(obj1 => obj1.workerCode === obj2.workerCode);
});

console.log(isSubset); // true

上述代码中,Array.every()方法会遍历arr2中的每个对象,并将其传递给回调函数obj2 => {…}。在回调函数中,我们使用Array.some()方法在arr1中查找是否存在与obj2相同的对象,将其赋值给isSubset。如果所有的obj2都存在相同的对象,说明arr2是arr1的子集,因此返回true。如果存在任何一个obj2没有相同的对象,说明arr2不是arr1的子集,因此返回false。最终,我们可以使用console.log()方法打印isSubset的值,以验证arr2是否为arr1的子集。

请注意,上述代码中的条件判断仅基于workerCode属性进行,因为这是arr1和arr2中对象唯一的区分标识。如果两个数组中的对象可能存在其他属性值不同的情况,需要根据实际情况进行扩展判断。

3、场景3-删除arr1中不是相同的对象

删除arr1中不是相同的对象

let arr1 = [
{ classify: "1", workerCode: 15 },
{ classify: "1", workerCode: 16 },
{ classify: "1", workerCode: 17}
];

let arr2 = [
{ classify: "1", workerCode: 15},
{ classify: "1", workerCode: 16 },
]; 

arr1 = arr1.filter(obj1 => {
  // 判断arr2中是否存在与obj1相同的对象
  const foundObj2 = arr2.find(obj2 => obj2.workerCode === obj1.workerCode);
  // 如果存在相同的对象,保留obj1
  if (foundObj2) {
    return true;
  }
  // 如果不存在相同的对象,删除obj1
  else {
    return false;
  }
});

上述代码与之前删除arr1中比arr2中多的对象的代码基本相同,唯一的区别是在条件判断部分。在这里,我们仍然使用Array.find()方法在arr2中查找是否存在与obj1相同的对象,将其赋值给foundObj2。如果存在相同的对象,说明obj1在arr2中也存在,应该保留在arr1中,因此返回true。如果不存在相同的对象,说明obj1在arr2中不存在,应该被删除,因此返回false。最终,Array.filter()方法会返回一个新的数组,其中仅包含arr1和arr2中相同的对象。

因此,我们可以使用上述代码来删除arr1中不是相同的对象。最终的结果应该是arr1仅包含arr2中的对象,即:

console.log(arr1); // [{ classify: "1", workerCode: 15 }, { classify: "1", workerCode: 16 }]
4、场景4-js对象数组,去重后合并

js对象数组,去重后合并

let arr1 = [
  { classify: "1", workerCode: 15 },
  { classify: "1", workerCode: 16 },
  { classify: "1", workerCode: 17 }
];

let arr2 = [
  { classify: "1", workerCode: 15 },
  { classify: "1", workerCode: 18 },
  { classify: "1", workerCode: 19 }
];

// 合并两个数组
let mergedArray = arr1.concat(arr2);

// 创建一个Map来存储对象,使用workerCode作为键
let uniqueMap = new Map();

// 遍历合并后的数组
for (let obj of mergedArray) {
  const key = obj.workerCode;
  // 如果Map中不存在相同的键,则将对象添加到Map中
  if (!uniqueMap.has(key)) {
    uniqueMap.set(key, obj);
  }
}

// 将Map中的值转换为数组
let mergedAndUniqueArray = Array.from(uniqueMap.values());

console.log(mergedAndUniqueArray);

上述代码首先将两个数组arr1arr2通过concat()方法合并为一个数组mergedArray。然后,我们创建一个Map对象uniqueMap来存储对象,并使用workerCode属性作为键。接下来,我们遍历合并后的数组,并检查uniqueMap中是否已存在相同的键。如果不存在,则将对象添加到uniqueMap中。最后,我们使用Array.from()方法将uniqueMap中的值转换为数组,得到合并且去重后的数组mergedAndUniqueArray

输出结果将是合并且去重后的数组。在本例中,输出结果为:

[
  { classify: "1", workerCode: 15 },
  { classify: "1", workerCode: 16 },
  { classify: "1", workerCode: 17 },
  { classify: "1", workerCode: 18 },
  { classify: "1", workerCode: 19 }
]

对象的去重是基于workerCode属性的唯一性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值