javascript - 如何使用 lodash 检查两个对象的值是否相同
问题描述
我有两个对象,如下所示
对象 1:
{
"action": "Accept",
"destination_port": "",
"destination_subnet": "192.168.1.2",
"id": "59-1601004430291",
"lan_interface": "eth0",
"order": 2,
"protocol": "any",
"source_port": "",
"source_subnet": "192.168.0.0/32",
"wan_interface": "wlan0"
}
对象 2:
{
"action": "Accept",
"destination_port": "",
"destination_subnet": "0.0.0.0",
"lan_interface": "eth0",
"protocol": "tcp",
"source_port": "",
"source_subnet": "198.168.43.0",
"wan_interface": "wlan0"
}
我想比较两个对象并检查值是否相同。但是 object1 可能有一些在 object2 中不可用的属性。
我已经完成了如下的实现
const isDuplicate = (o1, o2) => {
if (
o1.action === o2.action &&
o1.destination_port === o2.destination_port &&
o1.destination_subnet === o2.destination_subnet &&
o1.lan_interface === o2.lan_interface &&
o1.protocol === o2.protocol &&
o1.source_port === o2.source_port &&
o1.source_subnet === o2.source_subnet &&
o1.wan_interface === o2.wan_interface
) {
return true;
} else {
return false;
}
};
我想知道它是否可以用lodash简化
解决方案
用于_.isEqual()
比较_.pick()
要检查的两个项目的子集(通过 ):
const isDuplicate = (...objs) => _.isEqual(...objs.map(o => _.pick(
o,
['action', 'destination_port', 'destination_subnet', 'lan_interface', 'protocol', 'source_port', 'source_subnet', 'wan_interface'],
)))
const obj1 = {"action":"Accept","destination_port":"","destination_subnet":"192.168.1.2","id":"59-1601004430291","lan_interface":"eth0","order":2,"protocol":"any","source_port":"","source_subnet":"192.168.0.0/32","wan_interface":"wlan0"}
const obj2 = {"action":"Accept","destination_port":"","destination_subnet":"0.0.0.0","lan_interface":"eth0","protocol":"tcp","source_port":"","source_subnet":"198.168.43.0","wan_interface":"wlan0"}
const result = isDuplicate(obj1, obj2)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>
如果第二个对象始终是第一个对象的子集,则可以_.isMatch()
改用,但这只会检查存在于 上的属性obj2
:
const obj1 = {"action":"Accept","destination_port":"","destination_subnet":"192.168.1.2","id":"59-1601004430291","lan_interface":"eth0","order":2,"protocol":"any","source_port":"","source_subnet":"192.168.0.0/32","wan_interface":"wlan0"}
const obj2 = {"action":"Accept","destination_port":""}
const result = _.isMatch(obj1, obj2)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>
推荐阅读
- python - ModuleNotFoundError:没有名为“magenta.protobuf”的模块,但我已经安装了它
- reactjs - 关于react类组件setState的问题
- c++ - 使用 Range-v3 过滤 group_by 输出的正确方法是什么?
- python - 在 tensorflow 中查看错误的预测
- javascript - 不能在函数外使用变量。给出未定义的
- blockchain - 用于 getaccount/getbalance 的 TRC20 curl
- c# - TCP 发送方机器接收方窗口大小在 Windows 机器上发送少量数据几分钟后缩小为 0
- python-3.x - 定义100个数组,一个改变了,其他的也会改变
- python - 如何在 Selenium python 上实现脚本:按下弹出按钮并转到页面?
- reactjs - 如何使用 react-places-autocomplete 获取邮政编码