我有时不时使用JavaScript,并且偶然发现了“最佳实践”问题。 假设我有一个具有相同类型和结构的对象数组,并且我只想用一个标记来标记其中的一个对象(例如isOptimal:true)。这显然是可行的,但是我想知道是否在JS-world中,只有一个对象包含某些属性而其他数组项具有“未定义”的位置是一种好/不好的做法?也许有一些缺点,我很想知道吗?显然,存在未定义的检查。 非常感谢您对此发表的意见,谢谢。
答案 0 :(得分:3)
可以与对象数组具有不同的结构。 这是为什么NoSQL Document JSON结构比关系数据库(其中所有对象(如表)都应具有相同的结构)(无值,为空/空)更好地存储非结构化数据的原因之一。
但是请确保在使用嵌套结构时通过硬编码键引用并且不检查未定义的错误(例如obj.someKey.someValue
,如果在数组的几个对象中未定义someKey,则抛出错误,请确保您不会遇到麻烦! )
答案 1 :(得分:3)
假设您从数组中选择了两个对象,并希望确保其中一个是最优的,而另一个不是:
if(obj.isOptimal !== obj2.isOptimal)
现在如果isOptimal
是true
或undefined
都可以,如果您将false
设置为1,则上面的行将停止以false !== undefined
起作用。 / p>
如果您构建非结构化数据,则应始终确保没有不良的副作用,如这种情况。
对于基元,我将始终将其初始化为默认值(""
,0
,false
),我将始终将数组初始化为空数组([]
) ,除了undefined
是一个可行的选择(例如,如果user.age
是undefined
,我们还不知道年龄,如果是0
,则该用户刚刚出生),然后,您必须在进行数学运算之前始终检查undefined
。
但是对于嵌套对象,我认为undefined
是一个很好的默认值。然后,您必须在执行嵌套访问之前始终检查该嵌套对象是否存在:
if(user.car)
alert(user.car.model);
如果您必须通过添加其他属性来将属性添加到新结构中(例如,用户存储在localStorage中,那么存储中可能没有isOptimal
属性的旧对象)可以使用Object.assign
确保对象结构:
const user = Object.assign({ isOptimal: false }, userFromStorage);
答案 2 :(得分:2)
这种动态可能性是JavaScript语言的功能。可以做到这一点,但需要对其进行适当的管理。如果您开始添加太多不同的属性/属性,可能会变得一团糟并且令人困惑。
这种属性的替代方法是将其添加到原型中,以使isOptimal
为默认值为false
的属性。伪造undefined
的支票仍然有效。
答案 3 :(得分:2)
因此,您拥有对象数组,我们假设它是来自服务器的某种数据。并且您有一个 findOptimal()函数来找出最佳选择(一个),它遍历所有最佳选择,并用等于或等于 isOptimal 的属性对其进行标记真正。
因此您正在变异原始数据。并且要过滤最佳对象,您需要再次进行迭代。
为避免出现这种情况,您可以创建一个数组 optimalObjects ,并使用 findOptimal()函数将一个最佳对象的索引压入其中。这样,您就不会变异任何数据,而且发现最佳对象也变得更加容易,因为您无需遍历它们,因此有了索引。