javascript - 从 js 数组中删除公共对象并创建新的 js 数组
问题描述
我在 JSON 数组下面有这个。在此,我想找到公共项目对象并将其添加到另一个列表中,然后将其从源列表中删除。具有 id 的项目对于两个对象是通用的。此外,该列表是动态的。
[
{
"id": 1,
"item": {
"id": 1,
"name": "itemA"
}
},
{
"id": 2,
"item": {
"id": 1,
"name": "itemA"
}
},
{
"id": 3,
"item": {
"id": 2,
"name": "itemB"
}
}
]
解决方案
Array.reduce
在你的数组上,传递一个累加器。- 累加器跟踪找到的元素。
- 检查累加器是否先前找到了迭代元素
id
,如果是,则将其推入重复项。 - 否则将其推入
arr
.
const arr = [
{
"id": 1,
"item": {
"id": 1,
"name": "itemA"
}
},
{
"id": 2,
"item": {
"id": 1,
"name": "itemA"
}
},
{
"id": 3,
"item": {
"id": 2,
"name": "itemB"
}
}
]
const result = arr.reduce((acc, el, i) => {
if (acc.found[el.item.id]) {
acc.duplicates.push(el)
} else {
acc.source.push(el)
}
acc.found[el.item.id] = true
if (i === arr.length - 1)
delete acc.found
return acc
}, {
source: [],
duplicates: [],
found: {}
})
console.log(result.source) // source with removed duplicates
console.log(result.duplicates) // array of duplicates
推荐阅读
- javascript - Async Javascript:试图间隔多次进行 AJAX API 调用?
- maya - Unreal Viewer 中骨骼中的红色骨骼是什么?
- ruby-on-rails - 如何编写一个简单的 if 语句来检查当前用户是否已经查看过某些内容?
- google-api - 如何使用 Nodejs 获取视频观看次数 youtube api
- javascript - 跨域跟踪 Iframe 跟踪错误 id
- reactjs - 在 Mac 上的终端中运行 create-react-app 时出现异常错误
- ruby-on-rails - 使用 Devise 和 ActiveAdmin 在 ruby on rails 的 api 项目中出现授权错误
- angular - AngularFire2 - 在字符串中获取下载 URL firebase 存储
- android - Unity Android Build - 更改场景出错
- python - selenium WebDriverException:在无头 Pi 上发生“连接被拒绝”