javascript - 从对象数组中删除除最后一个相似键之外的所有键
问题描述
我有一个对象数组。许多 obj=jects 具有相同的密钥。如何从数组中删除除最后一个之外具有相同键的所有对象。
这是我的对象数组:
[
{d0: "abc"},
{d0: "xyz"},
{d1: "abc"},
{d3: "xyz"},
{d3: "abc"}
]
我只希望在数组中按键最后一次出现对象。
本质上,我正在寻找我的数组看起来像这样:
[
{d0: "xyz"},
{d1: "abc"},
{d3: "abc"}
]
我不知道该怎么做。
解决方案
如果你想要一个数组:
您可以使用reduceRight
包含Set
对象的函数和闭包:
arr.reduceRight(((s = new Set()) =>
(acc, obj, i) => s.has((key = Object.keys(obj)[0])) ?
acc :
( s.add(key), acc.push(obj), acc )
)(), []);
let arr =[
{d0: "abc"},
{d0: "xyz"},
{d1: "abc"},
{d3: "xyz"},
{d3: "abc"}
]
let result = arr.reduceRight(((s = new Set()) =>
(acc, obj, i) => s.has((key = Object.keys(obj)[0])) ?
acc :
( s.add(key), acc.push(obj), acc )
)(), []);
console.log(result);
如果您只想要一个累积对象:
您可以与功能Object.assign
结合使用reduce
arr.reduce((acc,k) => (acc = Object.assign(acc, k)), {})
let arr =[
{d0: "abc"},
{d0: "xyz"},
{d1: "abc"},
{d3: "xyz"},
{d3: "abc"}
]
let result = arr.reduce((acc,k) => (acc = Object.assign(acc, k)), {});
console.log(result);
可能一种更高效的方法是从列表的末尾进行迭代,如果密钥已经存在,则使用reduceRight
arr.reduceRight((acc,k) => acc[Object.keys(k)[0]] ? acc : ( acc = Object.assign(acc, k) ), {});
let arr =[
{d0: "abc"},
{d0: "xyz"},
{d1: "abc"},
{d3: "xyz"},
{d3: "abc"}
]
let result = arr.reduceRight((acc,k,i) => acc[Object.keys(k)[0]] ? acc : ( acc = Object.assign(acc, k) ), {});
console.log(result);
推荐阅读
- python - Python Selenium 奇怪的 ElementNotVisible 异常
- c - 在 C 程序中调用 strace(+Seg 错误)
- swift - RxSwift:除了使用回调之外,如何建立可观察的函数调用链?
- scala - 如何在 Spark 中创建 Schema 文件
- .htaccess - .htaccess - 删除一个变量和 301 重定向,但不影响其他变量?
- python - Numpy:关于 numpy.ufunc.reduceat 的第二条规则?
- routing - Istio / Kuberentes 中的用户特定路由
- c++ - 具有伪继承设计 C++ 的模板
- python - 如何在不更改字节的情况下将字符串转换为浮点数?
- angular - 表单的复选标记验证