Node JS中包含值[{}]的变量的比较

时间:2013-11-23 13:42:48

标签: node.js comparison

如何在Node JS中检查变量是否等于[{}]?

尝试了所有可行的方法。但没有运气。非常感谢帮助。

谢谢, VARUN

4 个答案:

答案 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.equalassert.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, ... )更复杂的内容 - 更多的内容违反了“关注原则”。