在JavaScript中比较对象的最佳方法是什么?
例:
var user1 = {name : "nerd", org: "dev"};
var user2 = {name : "nerd", org: "dev"};
var eq = user1 == user2;
alert(eq); // gives false
Run Code Online (Sandbox Code Playgroud)
我知道如果它们引用完全相同的对象,则两个对象是相等的,但有没有办法检查它们是否具有相同的属性值?
以下方式对我有用,但这是唯一的可能性吗?
var eq = Object.toJSON(user1) == Object.toJSON(user2);
alert(eq); // gives true
Run Code Online (Sandbox Code Playgroud) 我想澄清一下我是否理解正确:
== - >是参考比较,即两个对象都指向相同的内存位置.equals() - >计算对象中值的比较我的理解是正确的吗?
Jasmine有内置的匹配器toBe和toEqual.如果我有这样的对象:
function Money(amount, currency){
this.amount = amount;
this.currency = currency;
this.sum = function (money){
return new Money(200, "USD");
}
}
Run Code Online (Sandbox Code Playgroud)
并尝试比较new Money(200, "USD")和和的结果,这些内置的匹配器将无法按预期工作.我已经设法基于自定义equals方法和自定义匹配器实现了一种解决方法,但它似乎很有效.
比较Jasmine中对象的标准方法是什么?
为什么用Python "hello" is "hello"生成True?
我在这里阅读以下内容:
如果两个字符串文字相等,则它们被放在相同的内存位置.字符串是不可变的实体.不会造成伤害.
因此,每个Python字符串在内存中只有一个位置?听起来很奇怪.这里发生了什么?
我正在创建所有语言的下拉列表.列表的默认语言选择将由用户添加的信息确定:
<select>
<c:forEach items="${languages}" var="lang">
<c:choose>
<c:when test="${lang}.equals(${pageLang})">
<option value="${lang}" selected>${lang}</option>
</c:when>
<c:otherwise>
<option value="${lang}">${lang}</option>
</c:otherwise>
</c:choose>
</c:forEach>
</select>
Run Code Online (Sandbox Code Playgroud)
.equals在EL中似乎不存在.看了一下这里建议我编写自己的函数,然后导入并使用它.因为这只是针对此页面的一个小小的事情,我不想为此开始创建库等.我也不想开始为servlet创建专家对象,并在其中返回这些额外信息.
我唯一能想到的就是从servlet返回整个选项行的实际html,而不仅仅是语言字符串,但这让我觉得很难看,所以我希望有一个更优雅的解决方案.
快速修复EL中两个字符串的最佳方案是什么?
我必须比较两个Integer对象(不是int).比较它们的规范方法是什么?
Integer x = ...
Integer y = ...
Run Code Online (Sandbox Code Playgroud)
我能想到这个:
if (x == y)
Run Code Online (Sandbox Code Playgroud)
该==运营商只比较基准,因此这将仅适用于较低的整数值工作.但也许自动拳击踢......?
if (x.equals(y))
Run Code Online (Sandbox Code Playgroud)
这看起来像是一项昂贵的操作.是否有以这种方式计算的哈希码?
if (x.intValue() == y.intValue())
Run Code Online (Sandbox Code Playgroud)
有点冗长......
编辑:谢谢你的回复.虽然我知道现在要做什么,事实是分布在所有现有的答案(甚至是已删除的答案:)),我真的不知道,接受哪一个.所以我会接受最好的答案,它指的是所有三种比较可能性,或者至少是前两种.
有没有办法我可以做一个浅层比较,不会下去比较Javascript或lodash中对象内部的对象内容?请注意,我确实检查了lodash,但似乎进行了深入的比较,我不想这样做.
var a = { x: 1, y: 2}
var b = { x: 1, y: 3}
Run Code Online (Sandbox Code Playgroud)
有没有办法比较a和b?
是否in_array()做对象比较,它检查所有属性都是一样的吗?如果$obj1 === $obj2它只是做指针比较呢?
我正在使用ORM,所以我宁愿循环测试对象,如果$obj1->getId()它已经在数组中,如果它进行对象比较.如果没有,in_array则更简洁.
在尝试了几个实现深度比较和复制JSON可序列化对象之后,我注意到最快的只是:
function deep_clone(a){
return JSON.parse(JSON.stringify(a));
};
function is_equal(a,b){
return JSON.stringify(a) === JSON.stringify(b);
};
Run Code Online (Sandbox Code Playgroud)
不过,我觉得这是作弊.就像我会发现一些会在将来惹恼我的问题.使用它们可以吗?
我正在检查这个问题Javascript深度比较 问题提问者的解决方案没有说服我所以我试图分析问题并提出了
var obj = {here: 2};
console.log(deepEqual(obj, obj));
// ? true
console.log(deepEqual(obj, {here: 1}));
// ? false
console.log(deepEqual(obj, {here: 2}));
// ? true
function deepEqual(a,b)
{
if( (typeof a == 'object' && a != null) &&
(typeof b == 'object' && b != null) )
{
var count = [0,0];
for( var key in a) count[0]++;
for( var key in b) count[1]++;
if( count[0]-count[1] != 0) {console.log('1');return false;}
for( var key in a)
{
if(!(key in b) || …Run Code Online (Sandbox Code Playgroud)