删除 JavaScript 数组中的重复对象不起作用
Remove duplicated objects in JavaScript Array not working
首先,我知道有很多关于 SO 的答案,但我对它们有一些疑问,这就是为什么我 post 关于这个主题的另一个问题。
这是我的对象数组:
0: {id: 'lAYOUT', label: 'lAYOUT', items: 'val1'}
1: {id: 'tecst', label: 'tecst', items: 'val1'}
2: {id: 'tecst', label: 'tecst', items: 'val1'}
我试图过滤掉只有 2 个值,因为数组中有 2 个相同的对象。我想通过 items
和 label
.
制作独特的对象
这就是我尝试使用 lodash
的方式:
const filteredArray = uniq(nestedItems, (item, key, a) => item.items && item.label)
但它仍然会返回所有 3 个元素。
我也这样试过:
const filteredArray = [...new Set(nestedItems)]
const data = [
{ id: 'id1', label: 'label1', items: 'items1' },
{ id: 'id2', label: 'label2', items: 'items2' },
{ id: 'id1', label: 'label1', items: 'items2' }
];
const unique = (...keys) => [
...new Map(data.map(item => [keys.map(key => item[key]).join(), item])).values()
];
console.log(1, unique('label'));
console.log(2, unique('label','items'));
使用 Filter 获取特定对象 value, index and array
。
使用 FindIndex 获取特定的数组对象。并比较 filter object
和 findindex object
,如果 return 为假,则推入新数组!并制作新的独特数组!
试试这个代码!
let arr = [{ id: 'lAYOUT', label: 'lAYOUT', items: 'val1' },
{ id: 'tecst', label: 'tecst', items: 'val1' },
{ id: 'tecst', label: 'tecst', items: 'val1' }];
let newArr = arr.filter((value, index, self) =>
index === self.findIndex((t) => (
t.label === value.label && t.items === value.items
))
);
console.log(newArr, 'newArr');
您可以使用散列分组按几个键进行过滤:
const data = [{ id: 'lAYOUT', label: 'lAYOUT', items: 'val1' }, { id: 'tecst', label: 'tecst', items: 'val1' }, { id: 'tecst', label: 'tecst', items: 'val1' }];
const unique = Object.values(data.reduce((acc, obj) => {
const hash = `${obj.id}-${obj.label}`;
acc[hash] = obj;
return acc;
}, {}));
console.log(unique);
.as-console-wrapper{min-height: 100%!important; top: 0}
与 lodash 相同的结果
const data = [{ id: 'lAYOUT', label: 'lAYOUT', items: 'val1' }, { id: 'tecst', label: 'tecst', items: 'val1' }, { id: 'tecst', label: 'tecst', items: 'val1' }];
const result = _.uniqWith(data, (o1, o2) => `${o1.id}-${o1.label}` === `${o2.id}-${o2.label}`);
console.log(result);
.as-console-wrapper{min-height: 100%!important; top: 0}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.js" integrity="sha512-2iwCHjuj+PmdCyvb88rMOch0UcKQxVHi/gsAml1fN3eg82IDaO/cdzzeXX4iF2VzIIes7pODE1/G0ts3QBwslA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
首先,我知道有很多关于 SO 的答案,但我对它们有一些疑问,这就是为什么我 post 关于这个主题的另一个问题。
这是我的对象数组:
0: {id: 'lAYOUT', label: 'lAYOUT', items: 'val1'}
1: {id: 'tecst', label: 'tecst', items: 'val1'}
2: {id: 'tecst', label: 'tecst', items: 'val1'}
我试图过滤掉只有 2 个值,因为数组中有 2 个相同的对象。我想通过 items
和 label
.
这就是我尝试使用 lodash
的方式:
const filteredArray = uniq(nestedItems, (item, key, a) => item.items && item.label)
但它仍然会返回所有 3 个元素。
我也这样试过:
const filteredArray = [...new Set(nestedItems)]
const data = [
{ id: 'id1', label: 'label1', items: 'items1' },
{ id: 'id2', label: 'label2', items: 'items2' },
{ id: 'id1', label: 'label1', items: 'items2' }
];
const unique = (...keys) => [
...new Map(data.map(item => [keys.map(key => item[key]).join(), item])).values()
];
console.log(1, unique('label'));
console.log(2, unique('label','items'));
使用 Filter 获取特定对象 value, index and array
。
使用 FindIndex 获取特定的数组对象。并比较 filter object
和 findindex object
,如果 return 为假,则推入新数组!并制作新的独特数组!
试试这个代码!
let arr = [{ id: 'lAYOUT', label: 'lAYOUT', items: 'val1' },
{ id: 'tecst', label: 'tecst', items: 'val1' },
{ id: 'tecst', label: 'tecst', items: 'val1' }];
let newArr = arr.filter((value, index, self) =>
index === self.findIndex((t) => (
t.label === value.label && t.items === value.items
))
);
console.log(newArr, 'newArr');
您可以使用散列分组按几个键进行过滤:
const data = [{ id: 'lAYOUT', label: 'lAYOUT', items: 'val1' }, { id: 'tecst', label: 'tecst', items: 'val1' }, { id: 'tecst', label: 'tecst', items: 'val1' }];
const unique = Object.values(data.reduce((acc, obj) => {
const hash = `${obj.id}-${obj.label}`;
acc[hash] = obj;
return acc;
}, {}));
console.log(unique);
.as-console-wrapper{min-height: 100%!important; top: 0}
与 lodash 相同的结果
const data = [{ id: 'lAYOUT', label: 'lAYOUT', items: 'val1' }, { id: 'tecst', label: 'tecst', items: 'val1' }, { id: 'tecst', label: 'tecst', items: 'val1' }];
const result = _.uniqWith(data, (o1, o2) => `${o1.id}-${o1.label}` === `${o2.id}-${o2.label}`);
console.log(result);
.as-console-wrapper{min-height: 100%!important; top: 0}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.js" integrity="sha512-2iwCHjuj+PmdCyvb88rMOch0UcKQxVHi/gsAml1fN3eg82IDaO/cdzzeXX4iF2VzIIes7pODE1/G0ts3QBwslA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>