Javascript 如何比较JSON对象结构,比较[{},{},{}]与{k:v,k2:v2,…}

Javascript 如何比较JSON对象结构,比较[{},{},{}]与{k:v,k2:v2,…},javascript,json,Javascript,Json,在我的PHP应用程序中,对于2个不同的工具,我得到2个json响应,但我想使用相同的javascript来处理这两个响应 我需要做的就是比较一下这个结构 data = [ {'k1':'v1'}, {'k2':'v2'}, {'k3':'v3'} ] 关于这一点: data = {'k11':'v11', 'k22':'v22', 'k33':'v33'} 这必须适用于任意数量的结果(假设它们不匹配),并且如果在两种情况中的任何一种情况下都给出了一个结果,那么它也需要起作用 我已

在我的PHP应用程序中,对于2个不同的工具,我得到2个json响应,但我想使用相同的javascript来处理这两个响应

我需要做的就是比较一下这个结构

data = [
  {'k1':'v1'},
  {'k2':'v2'},
  {'k3':'v3'}
]
关于这一点:

data = {'k11':'v11', 'k22':'v22', 'k33':'v33'}
这必须适用于任意数量的结果(假设它们不匹配),并且如果在两种情况中的任何一种情况下都给出了一个结果,那么它也需要起作用

我已经试过了 -使用data.length(我认为在第二种情况下会得到1个数组 -数组的数据实例,对于这两种情况都是如此(如果我使用对象的数据实例,情况也是一样)

在javascript中比较这些的最佳方法是什么


编辑:假设两个json的键和值不匹配,我只想比较结构,或者检测其中一个,而不检测另一个。(对象数组vs带有属性的对象)

要检查接收到的数据是第一种格式还是第二种格式,您可以只检查数据是否为数组

正确的方法如下:

if( Object.prototype.toString.call( data ) === '[object Array]' )
{
    // an array: parse data according to first format
}
else
{
    // not an array: parse data according to second format
}

第一个是对象数组;第二个是具有属性的对象

如果您需要在PHP端执行此操作,只需在输出前对第二个数据结构(第二个参数将其转换为数组)执行
json_decode($data,true)
。您可能需要对其进行一些处理,以使结构对齐,但这应该非常简单

否则,在js中-

var data = [
  {'k':'v'},
  {'k2':'v2'},
  {'k3':'v3'}
],
data2 = {'k':'v', 'k2':'v2', 'k3':'v3'},
data3 = [];

for (var x in data2) {
    data3.push({x:data2[x]});
}

有几种方法可以做到这一点。我会将数组展平,使其与对象的格式匹配:

function Flatten(source) {
    if (!source || !source.length || source.length === 0) {
        return source;
    }
    var output = {};
    for (var i = 0; i < source.length; i++) {
        for (prop in source[i]) {
            if (source[i].hasOwnProperty(prop)) {
                output[prop] = source[i][prop];
            }
        }
    }
    return output;
}
函数展平(源代码){
如果(!source | |!source.length | | source.length==0){
返回源;
}
var输出={};
对于(变量i=0;i

这里有一个

我不确定你所说的“比较”是什么意思,但是如果你想要一个纯JavaScript的解决方案来找出结构是否等效,你可以使用这个

简单浅解
一种简单的方法是使用JSON.stringify(o1)==JSON.stringify(o2)。应该避免这种情况,而是使用深度递归比较。您可以将数组展平,使其看起来像第二个数组。对象的深度/复杂程度如何?这是最复杂的情况吗?数组中的对象是多个键,还是只有一个键?比较是什么意思?您需要知道哪些项不同于其他项吗d哪些项目没有?你只需要知道结构是否等效吗?@Christopherraris比较StructureSorry,但我只是想找到一种方法来比较结构,而不是值。无论如何,感谢我发布的代码,你正在比较两者。“相等”如果结构和内容都匹配,则计算true。我一次只得到一个,因此我没有2个要比较,这是两个结构之间要匹配的内容数,如果(typeof(data.length)!=“undefined”(未定义),则不太可能出现这种情况------>FIRST format更新了答案。还更新了使用更安全方法检查数据是否为数组的方法-从那时起,我使用
data3={'k11':'v11','k31':'v31};
data2={'k1':'v1','k2':'v2','k3':'v3};
控制台.log(相当于(data2,data3));
给出false,而我正在寻找的解决方案应该给出true为什么它应该返回true?
'k1'!='k11'
。因为我正在寻找一种比较结构的简单方法,我不想比较值。我希望您的php解决方案好得多,非常适合!但既然我要的是js解决方案,我怎么能使用s一种简单的方法来检测它是一个对象数组还是一个属性一次只获取其中一个(没有其他属性可比较)的对象?在JS中,数组是一个对象。测试特定于数组的方法,如“slice”->`if(data2.slice)但是,如果不将功能封装到函数中,则会变得很混乱。
function numOwnProperties (obj) {
  var i = 0;
  for (var key in obj) {
    if (obj.hasOwnProperty(key)) { i++; }
  }
  return i;
}

function areEquivalent (obj, arr) {  

  var length = arr.length;

  if (numOwnProperties(obj) !== length) { return false; }

  for (var i = 0; i < length; i++) {
    var item = arr[i];
    for (var key in item) {
      if (item.hasOwnProperty(key) && item[key] !== obj[key]) {
        return false;
      }
    }
  }

  return true;

};
data1 = [
  {'k':'v'},
  {'k2':'v2'},
  {'k3':'v3'}
];

data2 = {
  'k':'v',
  'k2':'v2',
  'k3':'v3'
};

console.log(areEquivalent(data2, data1)); // true