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>