lodash求对象数组交集
时间: 2024-08-13 20:01:44 浏览: 167
lodash是一个流行的JavaScript实用程序库,它提供了一系列便捷的功能,包括处理数组和对象的操作。如果你想要从对象数组中找出所有共有的属性作为结果,可以使用lodash的`_.intersectionBy`函数。
`_.intersectionBy(arr1, arr2, [iteratee])`这个方法接收两个或更多的数组,并通过提供的迭代器函数(iteratee)对元素进行比较,找到它们之间的共同部分。如果没提供迭代器,那么默认会使用JavaScript的严格相等运算符(`===`)来判断两个值是否相等。
例如,假设你有两个对象数组:
```javascript
const arr1 = [{ id: 1, name: 'John' }, { id: 2, age: 30 }];
const arr2 = [{ id: 2, name: 'Jane' }, { id: 3, age: 40 }];
// 使用lodash计算共同的对象
const commonObjects = _.intersectionBy(arr1, arr2, (obj) => obj.id);
console.log(commonObjects); // 输出:[ { id: 2 } ]
```
在这里,`iteratee`函数用于比较每个对象的"id"属性。`_.intersectionBy`返回了一个新数组,包含只存在于这两个数组中id属性相同的对象。
相关问题
前端vue2如何对比两个数组对象的元素哪个修改了,哪个新增了,哪个删除了,并在各自的原数组打上对应的标记
在 Vue.js 中,如果你需要比较两个数组对象并找出哪些元素被修改、新增或删除,你可以借助一些JavaScript库如`lodash`或使用递归和`Array.prototype.findIndex`等原生方法。这里提供一种简单的示例方法:
1. 首先,安装`lodash`库(如果尚未安装):
```bash
npm install lodash
```
2. 然后,在你的Vue组件中引入`_.isEqual`(用来比较对象是否相等),`_.findIndex`(查找元素索引),以及`_.intersection`(获取两个数组交集):
```javascript
import _ from 'lodash';
```
3. 定义一个函数,接受两个数组作为参数,返回一个包含三个新数组的对象,分别表示已修改、新增和删除的元素:
```javascript
function compareArrays(arr1, arr2) {
const modified = [];
const added = _.difference([], arr2);
const removed = _.difference(arr1, arr2);
for (let i = 0; i < arr1.length; i++) {
if (!_.isEqual(arr1[i], arr2[i])) {
// 修改标记
arr1[i].isModified = true;
modified.push(i); // 或者直接push到新数组里,看需求
}
}
return { modified, added, removed };
}
```
4. 使用这个函数比较你的数组,并根据结果更新数组元素的标记:
```javascript
const result = compareArrays(array1, array2);
array1.forEach((item, index) => {
if (result.modified.includes(index)) {
console.log('Element at index', index, 'has been modified');
}
if (result.added.includes(index)) {
console.log('New element:', item, 'at index', index);
}
if (result.removed.includes(index)) {
console.log('Element deleted at index', index);
}
});
```
vue 获取多个时间段的交集
可以使用 moment.js 和 lodash 库来实现。具体步骤如下:
1. 安装 moment.js 和 lodash 库:
```
npm install moment lodash
```
2. 引入库:
```javascript
import moment from 'moment';
import _ from 'lodash';
```
3. 定义时间段数组:
```javascript
const periods = [
{
start: '2021-01-01 08:00:00',
end: '2021-01-01 12:00:00'
},
{
start: '2021-01-01 10:00:00',
end: '2021-01-01 14:00:00'
},
{
start: '2021-01-01 13:00:00',
end: '2021-01-01 18:00:00'
}
];
```
4. 使用 moment.js 将时间字符串转换为 moment 对象,并使用 lodash 库的 intersectionWith 方法获取交集:
```javascript
const moments = periods.map(period => ({
start: moment(period.start),
end: moment(period.end)
}));
const intersection = _.intersectionWith(moments, moments, (a, b) => {
return a.start.isSameOrBefore(b.end) && b.start.isSameOrBefore(a.end);
});
```
5. 将交集转换为时间段数组:
```javascript
const result = intersection.map(inter => ({
start: inter.start.format('YYYY-MM-DD HH:mm:ss'),
end: inter.end.format('YYYY-MM-DD HH:mm:ss')
}));
console.log(result);
```
输出结果为:
```javascript
[
{
start: '2021-01-01 10:00:00',
end: '2021-01-01 12:00:00'
},
{
start: '2021-01-01 13:00:00',
end: '2021-01-01 14:00:00'
}
]
```
阅读全文