如何使用 lodash 从对象数组中获取不同的元素(不区分大小写)
How to get distinct elements(case insensitive) from array of objects using lodash
我有一个如下所示的数组,
[
{
"_id": "5e3ccb88c9b3027ef4977894",
"name": "microsoft"
},
{
"_id": "59ce020caa87df4da0ee2c77",
"name": "Microsoft"
},
{
"_id": "5e077c78bc0d663d7170ba1c",
"name": "MICROSOFT"
},
{
"_id": "608839e8d9271457814a7aa4",
"name": "Microsoft "
},
{
"_id": "5ecd46657ffa9b761a0e41cd",
"name": "Microsoft - MSN"
},
{
"_id": "5dfb47adbc0d663d716fe25f",
"name": "Microsoft Alumni Foundation"
}
]
现在我只需要一个 Microsoft,而不是使用 lodash 的这些案例组合。
预期输出,
[
{
"_id": "608839e8d9271457814a7aa4",
"name": "Microsoft "
},
{
"_id": "5ecd46657ffa9b761a0e41cd",
"name": "Microsoft - MSN"
},
{
"_id": "5dfb47adbc0d663d716fe25f",
"name": "Microsoft Alumni Foundation"
}
]
谁能帮我解决这个问题?找到了很多解决方案,但我需要不区分大小写的过滤器。
提前致谢。
您可以使用 _.filter
, _.toLower
and _.trim
来执行此操作。
我们可以保留 seen
Set()
个值,这样我们就知道我们以前看过哪些项目。在添加或检查此集合之前使用 _.toLower
和 _.trim
我们可以确保该项目不是数组中另一项目的微小变化。
像这样:
let data = [ { _id: '5e3ccb88c9b3027ef4977894', name: 'microsoft' }, { _id: '59ce020caa87df4da0ee2c77', name: 'Microsoft' }, { _id: '5e077c78bc0d663d7170ba1c', name: 'MICROSOFT' }, { _id: '608839e8d9271457814a7aa4', name: 'Microsoft ' }, { _id: '5ecd46657ffa9b761a0e41cd', name: 'Microsoft - MSN' }, { _id: '5dfb47adbc0d663d716fe25f', name: 'Microsoft Alumni Foundation' }, ];
const testPrefixes = new Set();
let res = _.filter(data, (o) => {
if (testPrefixes.has(_.trim(_.toLower(o.name)))) return false;
else return testPrefixes.add(_.trim(_.toLower(o.name)));
});
console.log(res);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
这是我随身携带的一个无库实用程序(在 TypeScript 中):
const dedupeArrayBy = <T, TK>(items: T[], selector: (item: T) => TK): T[] => {
const m = new Map(items.map((item) => [selector(item), item] as const));
return [...m.values()];
};
所以你可以:
const deduped = dedupeArrayBy(items, v => v.name.trim().toLowerCase());
这是Javascript翻译:
"use strict";
const dedupeArrayBy = (items, selector) => {
const m = new Map(items.map((item) => [selector(item), item]));
return [...m.values()];
};
let data = [{
_id: '5e3ccb88c9b3027ef4977894',
name: 'microsoft'
}, {
_id: '59ce020caa87df4da0ee2c77',
name: 'Microsoft'
}, {
_id: '5e077c78bc0d663d7170ba1c',
name: 'MICROSOFT'
}, {
_id: '608839e8d9271457814a7aa4',
name: 'Microsoft '
}, {
_id: '5ecd46657ffa9b761a0e41cd',
name: 'Microsoft - MSN'
}, {
_id: '5dfb47adbc0d663d716fe25f',
name: 'Microsoft Alumni Foundation'
}, ];
console.log(dedupeArrayBy(data, v => v.name.trim().toLowerCase()));
您可以使用 lodash 的 _.uniqBy()
,它接受一个生成匹配条件的函数。在这种情况下 trim 字符串,并将其转换为小写:
const arr = [{"_id":"5e3ccb88c9b3027ef4977894","name":"microsoft"},{"_id":"59ce020caa87df4da0ee2c77","name":"Microsoft"},{"_id":"5e077c78bc0d663d7170ba1c","name":"MICROSOFT"},{"_id":"608839e8d9271457814a7aa4","name":"Microsoft "},{"_id":"5ecd46657ffa9b761a0e41cd","name":"Microsoft - MSN"},{"_id":"5dfb47adbc0d663d716fe25f","name":"Microsoft Alumni Foundation"}]
const result = _.uniqBy(arr, o => o.name.trim().toLowerCase())
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
因为你想要一系列重复中的最后一项,你可以反转数组,得到唯一的项目,然后反转回来:
const arr = [{"_id":"5e3ccb88c9b3027ef4977894","name":"microsoft"},{"_id":"59ce020caa87df4da0ee2c77","name":"Microsoft"},{"_id":"5e077c78bc0d663d7170ba1c","name":"MICROSOFT"},{"_id":"608839e8d9271457814a7aa4","name":"Microsoft "},{"_id":"5ecd46657ffa9b761a0e41cd","name":"Microsoft - MSN"},{"_id":"5dfb47adbc0d663d716fe25f","name":"Microsoft Alumni Foundation"}]
const result = _.reverse(_.uniqBy(
_.reverse([...arr]),
o => o.name.trim().toLowerCase()
))
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
我有一个如下所示的数组,
[
{
"_id": "5e3ccb88c9b3027ef4977894",
"name": "microsoft"
},
{
"_id": "59ce020caa87df4da0ee2c77",
"name": "Microsoft"
},
{
"_id": "5e077c78bc0d663d7170ba1c",
"name": "MICROSOFT"
},
{
"_id": "608839e8d9271457814a7aa4",
"name": "Microsoft "
},
{
"_id": "5ecd46657ffa9b761a0e41cd",
"name": "Microsoft - MSN"
},
{
"_id": "5dfb47adbc0d663d716fe25f",
"name": "Microsoft Alumni Foundation"
}
]
现在我只需要一个 Microsoft,而不是使用 lodash 的这些案例组合。
预期输出,
[
{
"_id": "608839e8d9271457814a7aa4",
"name": "Microsoft "
},
{
"_id": "5ecd46657ffa9b761a0e41cd",
"name": "Microsoft - MSN"
},
{
"_id": "5dfb47adbc0d663d716fe25f",
"name": "Microsoft Alumni Foundation"
}
]
谁能帮我解决这个问题?找到了很多解决方案,但我需要不区分大小写的过滤器。
提前致谢。
您可以使用 _.filter
, _.toLower
and _.trim
来执行此操作。
我们可以保留 seen
Set()
个值,这样我们就知道我们以前看过哪些项目。在添加或检查此集合之前使用 _.toLower
和 _.trim
我们可以确保该项目不是数组中另一项目的微小变化。
像这样:
let data = [ { _id: '5e3ccb88c9b3027ef4977894', name: 'microsoft' }, { _id: '59ce020caa87df4da0ee2c77', name: 'Microsoft' }, { _id: '5e077c78bc0d663d7170ba1c', name: 'MICROSOFT' }, { _id: '608839e8d9271457814a7aa4', name: 'Microsoft ' }, { _id: '5ecd46657ffa9b761a0e41cd', name: 'Microsoft - MSN' }, { _id: '5dfb47adbc0d663d716fe25f', name: 'Microsoft Alumni Foundation' }, ];
const testPrefixes = new Set();
let res = _.filter(data, (o) => {
if (testPrefixes.has(_.trim(_.toLower(o.name)))) return false;
else return testPrefixes.add(_.trim(_.toLower(o.name)));
});
console.log(res);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
这是我随身携带的一个无库实用程序(在 TypeScript 中):
const dedupeArrayBy = <T, TK>(items: T[], selector: (item: T) => TK): T[] => {
const m = new Map(items.map((item) => [selector(item), item] as const));
return [...m.values()];
};
所以你可以:
const deduped = dedupeArrayBy(items, v => v.name.trim().toLowerCase());
这是Javascript翻译:
"use strict";
const dedupeArrayBy = (items, selector) => {
const m = new Map(items.map((item) => [selector(item), item]));
return [...m.values()];
};
let data = [{
_id: '5e3ccb88c9b3027ef4977894',
name: 'microsoft'
}, {
_id: '59ce020caa87df4da0ee2c77',
name: 'Microsoft'
}, {
_id: '5e077c78bc0d663d7170ba1c',
name: 'MICROSOFT'
}, {
_id: '608839e8d9271457814a7aa4',
name: 'Microsoft '
}, {
_id: '5ecd46657ffa9b761a0e41cd',
name: 'Microsoft - MSN'
}, {
_id: '5dfb47adbc0d663d716fe25f',
name: 'Microsoft Alumni Foundation'
}, ];
console.log(dedupeArrayBy(data, v => v.name.trim().toLowerCase()));
您可以使用 lodash 的 _.uniqBy()
,它接受一个生成匹配条件的函数。在这种情况下 trim 字符串,并将其转换为小写:
const arr = [{"_id":"5e3ccb88c9b3027ef4977894","name":"microsoft"},{"_id":"59ce020caa87df4da0ee2c77","name":"Microsoft"},{"_id":"5e077c78bc0d663d7170ba1c","name":"MICROSOFT"},{"_id":"608839e8d9271457814a7aa4","name":"Microsoft "},{"_id":"5ecd46657ffa9b761a0e41cd","name":"Microsoft - MSN"},{"_id":"5dfb47adbc0d663d716fe25f","name":"Microsoft Alumni Foundation"}]
const result = _.uniqBy(arr, o => o.name.trim().toLowerCase())
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
因为你想要一系列重复中的最后一项,你可以反转数组,得到唯一的项目,然后反转回来:
const arr = [{"_id":"5e3ccb88c9b3027ef4977894","name":"microsoft"},{"_id":"59ce020caa87df4da0ee2c77","name":"Microsoft"},{"_id":"5e077c78bc0d663d7170ba1c","name":"MICROSOFT"},{"_id":"608839e8d9271457814a7aa4","name":"Microsoft "},{"_id":"5ecd46657ffa9b761a0e41cd","name":"Microsoft - MSN"},{"_id":"5dfb47adbc0d663d716fe25f","name":"Microsoft Alumni Foundation"}]
const result = _.reverse(_.uniqBy(
_.reverse([...arr]),
o => o.name.trim().toLowerCase()
))
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>