在我的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的键和值都不匹配,我只想比较结构,或者检测其中一个没有另一个。 (对象数组与具有属性的对象)
答案 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