Lodash 从嵌套数组中删除重复项
Lodash remove duplicates from nested array
刚开始查看 lodash 并试图弄清楚如何从嵌套对象中的数组中删除重复项。
使用循环:
const _ = require('lodash');
let data = {
"deviceA": {
"serviceA": [
"Foo",
"Bar",
"Foo Bar A",
"Foo Bar A",
"Foo Bar A"
],
"serviceB": [
"Foo",
"Bar",
"Foo Bar B",
"Foo Bar B",
"Foo Bar B"
]
}
}
for (const key in data) {
for (const key2 in data[key]) {
data[key][key2] = _.uniqWith(data[key][key2], _.isEqual)
}
}
console.log(data)
是否可以在不使用 for 循环的情况下使用纯 lodash 来解析嵌套对象并更新数组以删除重复项?
我认为你可以考虑一个没有 lodash 的解决方案,下面是一个如何使用纯 js 本机实现的示例。
let data = {
"deviceA": {
"serviceA": [
"Foo",
"Bar",
"Foo Bar A",
"Foo Bar A",
"Foo Bar A"
],
"serviceB": [
"Foo",
"Bar",
"Foo Bar B",
"Foo Bar B",
"Foo Bar B"
]
}
}
const noDup = Object.entries(data).reduce((p, n) => {
const a = Object.entries(n[1]).reduce((p1, n1) =>
({...p1, [n1[0]]: [...new Set(n1[1])]})
, {})
return {...p, [n[0]]: a}
}, {})
console.log(noDup)
可以结合uniq和mapValues来实现。
let data = {
"deviceA": {
"serviceA": [
"Foo",
"Bar",
"Foo Bar A",
"Foo Bar A",
"Foo Bar A"
],
"serviceB": [
"Foo",
"Bar",
"Foo Bar B",
"Foo Bar B",
"Foo Bar B"
]
},
"deviceB": {
"serviceA": [
"A",
"A",
"Foo Bar A",
],
"serviceB": [
"B",
"B",
"Foo Bar B",
]
}
}
const items = _.mapValues(data, (device) => _.mapValues(device, (service) =>_.uniq(service)))
console.log(items)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
刚开始查看 lodash 并试图弄清楚如何从嵌套对象中的数组中删除重复项。
使用循环:
const _ = require('lodash');
let data = {
"deviceA": {
"serviceA": [
"Foo",
"Bar",
"Foo Bar A",
"Foo Bar A",
"Foo Bar A"
],
"serviceB": [
"Foo",
"Bar",
"Foo Bar B",
"Foo Bar B",
"Foo Bar B"
]
}
}
for (const key in data) {
for (const key2 in data[key]) {
data[key][key2] = _.uniqWith(data[key][key2], _.isEqual)
}
}
console.log(data)
是否可以在不使用 for 循环的情况下使用纯 lodash 来解析嵌套对象并更新数组以删除重复项?
我认为你可以考虑一个没有 lodash 的解决方案,下面是一个如何使用纯 js 本机实现的示例。
let data = {
"deviceA": {
"serviceA": [
"Foo",
"Bar",
"Foo Bar A",
"Foo Bar A",
"Foo Bar A"
],
"serviceB": [
"Foo",
"Bar",
"Foo Bar B",
"Foo Bar B",
"Foo Bar B"
]
}
}
const noDup = Object.entries(data).reduce((p, n) => {
const a = Object.entries(n[1]).reduce((p1, n1) =>
({...p1, [n1[0]]: [...new Set(n1[1])]})
, {})
return {...p, [n[0]]: a}
}, {})
console.log(noDup)
可以结合uniq和mapValues来实现。
let data = {
"deviceA": {
"serviceA": [
"Foo",
"Bar",
"Foo Bar A",
"Foo Bar A",
"Foo Bar A"
],
"serviceB": [
"Foo",
"Bar",
"Foo Bar B",
"Foo Bar B",
"Foo Bar B"
]
},
"deviceB": {
"serviceA": [
"A",
"A",
"Foo Bar A",
],
"serviceB": [
"B",
"B",
"Foo Bar B",
]
}
}
const items = _.mapValues(data, (device) => _.mapValues(device, (service) =>_.uniq(service)))
console.log(items)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>