Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用jquery或javascript在JSON中重新定位对象的键_Javascript_Jquery_Json - Fatal编程技术网

如何使用jquery或javascript在JSON中重新定位对象的键

如何使用jquery或javascript在JSON中重新定位对象的键,javascript,jquery,json,Javascript,Jquery,Json,我有两个需要比较的对象。但是,对象中关键点的位置存在问题 var obj1 = [{ Name : abc; age : 23; }, { Name : def; age : 222; }] var obj2 = [{ age : 23; Name: abc; }, { age : 222; Name : def; }] 我试过使用下面的,但失败了 (JSON.stringify(obj1) == JSON.stringify(

我有两个需要比较的对象。但是,对象中关键点的位置存在问题

var obj1 = [{
    Name : abc;
    age : 23;
}, {
    Name : def;
    age : 222;
}]

var obj2 = [{
    age : 23;
    Name: abc;
}, {
    age : 222;
    Name : def;
}]
我试过使用下面的,但失败了

(JSON.stringify(obj1) == JSON.stringify(obj2))
是否有一种方法可以交换在对象中迭代的关键点的位置?我期待着这样的事情

var obj1 = [{
    Name : abc;
    age : 23;
}, {
    Name : def;
    age : 222;
}]

var obj2 = [{
    Name : abc;
    age : 23;
}, {
    Name : def;
    age : 222;
}]

对象中键的顺序无法保证,因此任何重新排列键的尝试都是多余的

然而根据您的描述,这似乎是一个XY问题,因为您的目标是比较对象。问题是无法直接比较对象。相反,比较它们的属性,例如

if (obj1[i].Name == obj2[i].Name && obj1[i].age == obj2[i].age) {
  // do something...
}

正如@Rorymcrossan所说的-


对象中键的顺序不受保证

您应该改为使用此代码

变量obj1=[{ 姓名:“abc”, 年龄:23 }, { 名称:“def”, 年龄:222 }]; 变量obj2=[{ 年龄:23,, 姓名:“abc” }, { 年龄:222, 名称:“def” }]; 函数isEqualobjA,objB{ 如果objA.length!==objB.length 返回false; 让isequal=真; 对于let i=0;i} 无序对象的键与有序数组的索引不同。要比较两个对象数组,并查看它们在每个数组元素中是否具有相同的对象和相同的键/值对,可以尝试以下操作:

function compareArrayOfObjects(array1, array2) {
  return array1.reduce(function(bool, obj, index) {
    return bool && array2[index] && isEqual(obj, array2[index]);
  }, array1.length === array2.length);
}
如果只需要比较像数字和字符串这样简单的值,则可以按如下方式实现isEqual:

function isEqual(a, b) {
  var aKeys = Object.getOwnPropertyNames(a);
  var bKeys = Object.getOwnPropertyNames(b);

  return aKeys.reduce(function(bool, aKey) {
    return bool && (a[aKey] === b[aKey]);
  }, aKeys.length === bKeys.length);
}
如果您需要深入的对象比较,那么您可能需要一个q.isEqual的LoDash实现

总而言之,你将拥有

变量obj1=[{ 姓名:“abc”, 年龄:23 }, { 名称:“def”, 年龄:222 }]; 变量obj2=[{ 年龄:23,, 姓名:“abc” }, { 年龄:222, 名称:“def” }]; var obj3=[{},{}]; 对象数组1、数组2的函数比较数组{ 返回数组1.reducefunctionbool,obj,index{ 返回bool&array2[index]&isEqualobj,array2[index]; },array1.length==array2.length; } 等质量函数{ var aKeys=Object.getOwnPropertyNamesa; var bKeys=Object.getOwnPropertyNamesb; 返回aKeys.reducefunctionbool,aKey{ 返回布尔值(&a[aKey]==b[aKey]; },aKeys.length==bKeys.length; } log'obj1和obj2与预期的true相同:'+comparararrayofobjectsobj1,obj2;
log'obj1和obj3与预期的false相同:'+comparararayofobjectsobj1,obj3 有更好的方法,虽然上面的例子可以工作,但对于未知的密钥,它们将失败

function compareArrayObjects(ob1, ob2) {
  let ob1Keys = Object.keys(ob1);
  let ob2Keys = Object.keys(ob2);
  return (ob1Keys.length == ob2Keys.length?(ob1Keys.every(key)=>(obj1[key]==ob2[key]))
   :false); 

}
或将使用一行解决方案

_.intersection(obj1,obj2);

好吧,正如所有其他答案已经告诉你的,你必须比较关键点,而不是对象本身。只是添加了另一个实现

函数值{ 返回值的类型===对象和值!==null; } 功能相似,b{ 如果a==b,则返回true; 返回isObjecta和isObjectb&& Object.keysa.everykey=>a[key]==b中未定义的| | key&&isSimilara[key],b[key]&& Object.keysb.everykey=>b[key]==未定义| | a中的键; } 变量obj1=[{ 姓名:“abc”, 年龄:23,, 此键未定义:未定义 }, { 名称:“def”, 年龄:222 }]; 变量obj2=[{ 年龄:23,, 姓名:“abc” }, { 年龄:222, 名称:“def” }];
console.logisSimilarobj1,obj2对象中键的顺序不能保证,因此您尝试执行的操作是多余的。正如您所见,对象无法直接进行比较。相反,比较它们的属性,例如:obj1.Name==obj2.Name&&obj1.age==obj2.agekey在Javascript对象中没有顺序,不要指望它:这种不顺序会遇到什么问题?他的问题实际上是按顺序比较两个对象数组,在比较结果字符串之前,他尝试使用JSON对其进行字符串化,但声明键的顺序不匹配使它们无法进行比较。@James数组中的每个项都是object,在连续比较两个数组时,比较每个元素是必须做的事。这如何迭代obj2?@HemanthPaluri我正在使用for循环迭代obj1。我还将此索引用于obj2关于完全比较成功的另一件事,它应该出现在if或else的主体中,因为我根据成功或失败调用服务。在上面的代码中,每次迭代都会转到body,对吗?那么我如何克服这个问题呢?就像ifCondition{body}else{body}@HemanthPaluri答案更新一样你应该遵循一些基本的javascript教程。你确定返回值为false吗;内部forEach的回调应影响为return false;为了平等?我认为在forEach之前需要一些变量,在回调中设置为false,并在forEach之后检查该变量。然而,使用每一个都是最好的
在这种情况下,我正准备发表同样的评论:@绝望,我的坏!谢谢你指出。。。我已经编辑了代码来修复它。