在javascript中只向数组的一个对象添加属性可以吗?
有时我偶尔会使用JavaScript,我会偶然发现一个关于“最佳实践”的问题。 假设我有一个相同类型和结构的对象数组,我只想用一个标志来标记其中的一个(例如,isOptimal:true)。这显然是可行的,但我想知道,在JS世界中,只有一个对象包含某些属性,而其他数组项却有“未定义”的属性,这是否是一种好的/坏的做法?也许有一些不利的方面,我很难看到?显然,存在未定义的检查。在javascript中只向数组的一个对象添加属性可以吗?,javascript,Javascript,有时我偶尔会使用JavaScript,我会偶然发现一个关于“最佳实践”的问题。 假设我有一个相同类型和结构的对象数组,我只想用一个标志来标记其中的一个(例如,isOptimal:true)。这显然是可行的,但我想知道,在JS世界中,只有一个对象包含某些属性,而其他数组项却有“未定义”的属性,这是否是一种好的/坏的做法?也许有一些不利的方面,我很难看到?显然,存在未定义的检查。 非常感谢您的意见,谢谢。这种动态可能性是JavaScript语言的一个特性。这样做是可能的,但需要进行适当的管理。如果您
非常感谢您的意见,谢谢。这种动态可能性是JavaScript语言的一个特性。这样做是可能的,但需要进行适当的管理。如果您开始添加太多不同的属性,它可能会变得混乱和混乱
此类属性的另一种选择是将其添加到原型中,使
isOptimal
成为默认为false
的属性。对未定义的进行错误检查仍然有效。可以对对象数组使用不同的结构。
这就是为什么NoSQL文档JSON结构比关系数据库更适合存储非结构化数据的原因之一,关系数据库中的所有对象(如表)都应该具有相同的结构。(空/空表示无值)
但是,在使用嵌套结构时,通过硬编码键引用,并且不检查未定义的错误(例如obj.someKey.someValue
,如果数组中的一些对象中未定义someKey,则抛出错误!)确保没有遇到问题,这样就有了对象数组,让我们假设这是来自服务器的某种数据。您有一个findOptimal()函数来找出最佳的一个(多个),它遍历所有的函数,找到最佳的,并用isOptimal属性将其标记为true
因此,您正在对原始数据进行变异。为了过滤最佳对象,您需要再次迭代
为了避免这种情况,您可以创建一个数组optimalObjects,并使用findOptimal()函数将最优对象的索引推到那里。通过这种方式,您不需要改变任何数据,也更容易找到最佳对象,因为您不需要对它们进行迭代,您就有了索引。假设您从数组中选择了两个对象,并希望确保其中一个是最佳的,另一个不是:
if(obj.isOptimal !== obj2.isOptimal)
现在,如果isOptimal
为true
或undefined
,如果将其设置为false
,则上述行将停止作为false!==未定义
如果您构建非结构化数据,您应该始终确保没有不必要的副作用,如本例所示
对于原语,我总是将它们初始化为默认值(”
,0
,false
),我总是将数组初始化为空数组([]
),除非未定义
是一个可行的选项(例如,如果user.age
是未定义的
我们还不知道年龄,如果是0
用户刚出生),那么在计算之前,您必须始终检查未定义的
但是,对于嵌套对象,我认为未定义的是一个很好的默认值。在执行嵌套访问之前,您必须始终检查嵌套对象是否存在:
if(user.car)
alert(user.car.model);
如果必须通过添加其他属性将属性添加到新结构中(例如,用户存储在localStorage中,则旧对象可能位于没有isOptimal
属性的存储器中),则可以使用对象。分配以确保对象结构:
const user = Object.assign({ isOptimal: false }, userFromStorage);
只要你知道你在用它做什么,这可能没问题。如果系统的其他部分无法依赖它,或者如果系统的其他部分由于某种原因或其他原因由于额外的属性而开始出现错误行为,那么就会出现问题。一般来说,如果你知道这可能发生,并且如果有充分的文档记录或自我解释,这不是问题如果代码中的这一部分进行了耗时的计算,那么数组中所有元素的统一结构可以提高性能。不必添加错误的值。即使对象中没有设置属性,使用isOptimal
进行检查也会产生所需的结果。@NinaScholz我刚刚通过添加另外一句话:“NoSQL文档JSON结构比关系数据库更好”——这是一个非常有争议的说法。它们在某些方面更好,在其他方面更差……我更新了这句话,使其看起来不那么固执己见。:)这是一个很好的例子。即使这不是我的案子,我也会牢记在心的,谢谢。@yan这还不是你的案子。。。在更改服务器端计算后,数据库中的一些对象突然具有NaN值,并且随着对它们进行越来越多的计算,NaN在整个系统中传播,并影响其他对象。我最终发现这是由我刚才添加的属性引起的,而我没有将其添加到数据库中的某些对象中。