如何比较JSON对象结构,比较[{},{},{}] vs {k:v,k2:v2,...}

时间:2014-01-24 18:27:42

标签: javascript json

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

我需要做的就是比较这种结构

data = [
  {'k1':'v1'},
  {'k2':'v2'},
  {'k3':'v3'}
]

这一个:

data = {'k11':'v11', 'k22':'v22', 'k33':'v33'}

这必须适用于任意数量的结果(它们不能匹配),如果在任何两种情况下都给出1个结果,它也需要工作。

我已经尝试过了   - 使用data.length(我认为在第二种情况下会给我一个数组   - data instanceof Array,对于这两种情况都是如此(如果我做数据instanceof对象,则相同)

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

EDITED:两个json的键和值都不匹配,我只想比较结构,或者检测其中一个没有另一个。 (对象数组与具有属性的对象)

4 个答案:

答案 0 :(得分:3)

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

如果您需要在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]});
}

答案 1 :(得分:1)

要检查收到的数据是采用第一种格式还是第二种格式,您只需检查数据是否为数组。

正确的方法如下:

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
}

答案 2 :(得分:1)

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

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;
}

这是fiddle

答案 3 :(得分:0)

我实际上并不确定“比较”是什么意思,但是如果你想要一个纯粹的JavaScript解决方案来找出结构是否相同,你可以使用它。

简单浅层解决方案

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