javascript - 如果变量存在并且它是一个对象,如何合并对象?
问题描述
我正在尝试如何合并两个变量,它是一个对象?
我试过这个似乎有效:
let data1 = {
data1: "data1"
}
let data2 = {
data2: "data2"
}
const items = {
...(data1 && typeof data1 === 'object' && { ...data1 }),
...(data2 && typeof data2 === 'object' && { ...data2 }),
}
console.log(items);
这很好,或者除非我把它复杂化了?
解决方案
...如果变量存在...
如果你的意思是字面意思,变量可能没有被声明,那么你需要将typeof
检查移到前面以避免尝试读取未声明变量的值。您还可以利用传播undefined
、null
或布尔值(如false
)不执行任何操作(包括不导致错误)这一事实。
在这里,我添加了一个data3
不存在的内容来显示该部分的实际效果:
let data1 = {
data1: "data1",
};
let data2 = {
data2: "data2",
};
const items = {
...typeof data1 === "object" && data1,
...typeof data2 === "object" && data2,
...typeof data3 === "object" && data3,
};
console.log(items);
它是如何工作的(以data1
示例为例):
typeof data1 === "object"
告诉我们两件事:- 有一个称为范围内的标识符
data1
(这意味着我们可以读取它的值而不必担心ReferenceError
为未声明的变量获取 a) - that
data1
的值是类型"object"
- 有一个称为范围内的标识符
- 这与
&& data1
意味着我们将使用这些值之一进行传播:false
如果typeof data1 === "object"
是false
, 或- 的值
data1
,可以是对象,也可以是null
传播null
不做任何事情,传播false
也不做任何事情,所以我们要么从该传播操作中获得任何属性,要么获得data1
引用的对象的自己的、可枚举的属性。
推荐阅读
- scheme - Chez Scheme 的 SRFI 实现
- c# - Http Post 文件从 Windows 窗体到服务器
- html - Vue没有渲染成html
- scikit-learn - 这个 Python 的 R 语言中的等效机器学习程序是什么?
- installation - 尝试安装 manjaro 并在分配磁盘可用空间时遇到问题
- java - Keycloak:使自定义 UserModel 实现适用于 OIDC
- mysql - SQL 或 Spring Data:选择一个表中的行并按另一表的属性排序
- vue.js - Vue CLI - 在 Vue.js 项目根目录中找不到 .env 文件
- javascript - 寻找一种更好的方法来减少数组并确定数字是否有序
- flutter - 在 streamBuilder 中使用提供者