我有一个数组如下:
const arr = [
{company: 'a', date: '1'},
{company: 'b', date: '1'},
{company: 'c', date: '1'},
{company: 'a', date: '2'},
{company: 'a', date: '1'},
{company: 'b', date: '2'},
]
我只想知道如何获取其中的独特对象。我尝试通过以下命令使用 lodash:
uniqBy(arr, 'date');
但它只返回:
[
{company: "a", date: "1"},
{company: "a", date: "2"}
]
我想要这样的东西:
[
{company: "a", date: "1"},
{company: "a", date: "2"},
{company: "b", date: "1"},
{company: "b", date: "2"},
{company: "c", date: "1"},
]
有没有办法在 lodash 或 vanilla JS 中完成这项工作?
最佳答案
在 reduce()
的帮助下在纯 js 中,我创建了一个函数,该函数将对象数组和键数组作为输入,并返回所有这些键唯一的数组。
以下是算法的步骤:
reduce()
创建一个对象。 . key
该对象的值将是所需键的值,每个键由 -
连接。 (我在代码注释中为每个对象提到了 keyString
)。 keyString
的对象表示 keys
的给定数组的相同值只会自动出现一次,因为对象不能有重复的键 Object.values()
来创建一个数组。 const arr = [
{company: 'a', date: '1'}, //keyString = "a-1"
{company: 'b', date: '1'}, //keyString = "b-1"
{company: 'c', date: '1'}, //keyString = "c-1"
{company: 'a', date: '2'}, //keyString = "a-2"
{company: 'a', date: '1'}, //keyString = "a-1"
{company: 'b', date: '2'}, //keyString = "b-2"
//The item at index 0 and index 4 have same keyString so only a single of them will remain in object.
]
const uniqueBy = (arr, keys) => {
const obj = arr.reduce((ac, a) => {
let keyString = keys.map(k => a[k]).join('-');
ac[keyString] = a;
return ac;
}, {});
return Object.values(obj);
}
console.log(uniqueBy(arr, ['company', 'date']))
关于javascript - 在数组中查找唯一对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59934985/