如何在Node JS中检查变量是否等于[{}]?
尝试了所有可行的方法。但没有运气。非常感谢帮助。
谢谢, VARUN
答案 0 :(得分:2)
我承认这不是最佳解决方案,但快速JSON字符串比较可以起作用:
var a = [{}]
JSON.stringify(a) == '[{}]' //true
否则,您将需要实现更强大的对象/数组比较,例如: TomášZato在How to compare arrays in JavaScript?
中的回答或者使用诸如underscore.js之类的lib。
答案 1 :(得分:1)
如果您要进行比较,可以使用assert中的deepEqual:
> a =[{}]
[ {} ]
> assert.deepEqual(a,[{}])
undefined
>
这可以用于对象结构中的等价。几乎是合适的,需要注意的是它会对未使用的[]和{}进行同样的处理。
> assert.deepEqual(a,[[]])
undefined
> assert.deepEqual({},[])
undefined
<强>更新强>
deepEqual不检查严格的相等性。然而,这对于测试两个对象是否具有相似的嵌套结构是有利的,除非上述警告适用于对象中的叶节点。例如。第二个案例
> assert.deepEqual({a:[{b:[]}]},{a:[{b:[]}]})
undefined
> assert.deepEqual({a:[{b:[]}]},{a:[{b:{}}]})
undefined
> assert.deepEqual({a:[{b:[]}]},{a:[{c:[]}]})
AssertionError: {"a":[{"b":[]}]} deepEqual {"a":[{"c":[]}]}
在检查对象结构时,这很方便。
答案 2 :(得分:1)
哦,这很简单:
Array.isArray(obj) //is really an array, no array-like object
&& obj.length === 1
&& Object.keys(obj).length === 1 //doesn't have anything enumerable attached
&& typeof obj[0] === 'object' // is an object
&& Object.keys(obj[0]).length === 0 // doesn't have enumerable properties
&& obj[0].__proto__ === Object.prototype // direct ancestor of Object
答案 3 :(得分:0)
我建议反对使用assert.equal
和assert.deepEqual
- 他们正在进行强制(==
)比较(这是相关的CommonJS正式证明的)规格,但i think they're broken)。大多数情况下,您不希望[ 3 ]
等于[ '3' ]
,这是assert.deepEqual
将告诉您的内容。
相反,使用例如https://github.com/jkroso/equals,其中(1)适用于原始值以及列表和对象,(2)允许您使用循环引用检查偶数对象。
@vkurchatkin我发现您的解决方案很简单 - 它是针对单个非常具体的用例量身定制的相当多的代码。此外,typeof
已知有一些问题 - specifically, it fails for arrays和__proto__
is a deprecated property(请改用Object.getPrototypeOf
)。
在JavaScript中测试相等性是一个经常出现的问题,遗憾的是,在NodeJS和其他JS虚拟机中没有得到充分解决(我相信它应该是这样)。我的建议是使用经过充分测试的库,它使用单个函数进行原始和对象相等性测试,最好是足够强大,不会因循环引用而失败。
理想情况下,您不希望在应用程序代码中看到比equals( d0, d1, d2, ... )
更复杂的内容 - 更多的内容违反了“关注原则”。