Javascript 修正了object diff算法以创建数组而不是对象
我正在尝试建立一个算法,可以输出两个对象之间的差异。当typeof对象是数组时,我不知道如何创建数组。我知道这和枚举数组时返回的第一个键有关,索引是字符串;"0". 因此,它将“0”指定为对象,而不是数组Javascript 修正了object diff算法以创建数组而不是对象,javascript,Javascript,我正在尝试建立一个算法,可以输出两个对象之间的差异。当typeof对象是数组时,我不知道如何创建数组。我知道这和枚举数组时返回的第一个键有关,索引是字符串;"0". 因此,它将“0”指定为对象,而不是数组 function difference(o1, o2) { var k; var kDiff; var diff = {}; for (k in o1)
function difference(o1, o2) {
var k;
var kDiff;
var diff = {};
for (k in o1)
{
if (!o1.hasOwnProperty(k)) { }
else if (typeof o1[k] != 'object' || typeof o2[k] != 'object')
{
if (!(k in o2) || o1[k] !== o2[k]){
diff[k] = o2[k];
}
} else if (kDiff = difference(o1[k], o2[k]))
{
diff[k] = kDiff;
}
}
for (k in o2)
{
if (o2.hasOwnProperty(k) && (!o1 || !(k in o1)))
{
diff[k] = o2[k];
}
}
for (k in diff)
{
if (diff.hasOwnProperty(k))
{
return diff;
}
}
return false;
}
测试用例
function difference(o1, o2) {
var k;
var kDiff;
var diff = {};
for (k in o1)
{
if (!o1.hasOwnProperty(k)) { }
else if (typeof o1[k] != 'object' || typeof o2[k] != 'object')
{
if (!(k in o2) || o1[k] !== o2[k]){
diff[k] = o2[k];
}
} else if (kDiff = difference(o1[k], o2[k]))
{
diff[k] = kDiff;
}
}
for (k in o2)
{
if (o2.hasOwnProperty(k) && (!o1 || !(k in o1)))
{
diff[k] = o2[k];
}
}
for (k in diff)
{
if (diff.hasOwnProperty(k))
{
return diff;
}
}
return false;
}
var lhs = {
"Id": 1,
"Type" : "Mortgage",
"Amount": 500000,
"Rate" : .045,
"Borrowers": [
{
"Id": 1,
"FirstName": "Jon",
"Employment": [
{
"Id": 1,
"Employer": "Walmart",
"Income": [
{
"Id": 1,
"MonthlyIncome": 5000,
"Type": "Base"
},
{
"Id": 2,
"MonthlyIncome": 1000,
"Type": "Overtime"
}
]
}
]
}
]
}
var rhs = {
"Id": 1,
"Type" : "Mortgage",
"Amount": 500001,
"Rate" : .045,
"Borrowers": [
{
"Id": 1,
"FirstName": "Don",
"Employment": [
{
"Id": 1,
"Employer": "Walmart",
"Income": [
{
"Id": 1,
"MonthlyIncome": 5000,
"Type": "Base"
},
{
"Id": 2,
"MonthlyIncome": 500,
"Type": "Other"
}
]
}
]
}
]
}
var changes = JSON.stringify(difference(lhs, rhs);
预期结果:
function difference(o1, o2) {
var k;
var kDiff;
var diff = {};
for (k in o1)
{
if (!o1.hasOwnProperty(k)) { }
else if (typeof o1[k] != 'object' || typeof o2[k] != 'object')
{
if (!(k in o2) || o1[k] !== o2[k]){
diff[k] = o2[k];
}
} else if (kDiff = difference(o1[k], o2[k]))
{
diff[k] = kDiff;
}
}
for (k in o2)
{
if (o2.hasOwnProperty(k) && (!o1 || !(k in o1)))
{
diff[k] = o2[k];
}
}
for (k in diff)
{
if (diff.hasOwnProperty(k))
{
return diff;
}
}
return false;
}
{
"Amount": 500001,
"Borrowers": [
{
"FirstName": "Don",
"Employment": [
{
"Income": [
{
"MonthlyIncome": 500,
"Type": "Other"
}
]
}
]
}
]
}
{
"Amount": 500001,
"Borrowers": {
"0": {
"FirstName": "Don",
"Employment": {
"0": {
"Income": {
"1": {
"MonthlyIncome": 500,
"Type": "Other"
}
}
}
}
}
}
}
不是:
function difference(o1, o2) {
var k;
var kDiff;
var diff = {};
for (k in o1)
{
if (!o1.hasOwnProperty(k)) { }
else if (typeof o1[k] != 'object' || typeof o2[k] != 'object')
{
if (!(k in o2) || o1[k] !== o2[k]){
diff[k] = o2[k];
}
} else if (kDiff = difference(o1[k], o2[k]))
{
diff[k] = kDiff;
}
}
for (k in o2)
{
if (o2.hasOwnProperty(k) && (!o1 || !(k in o1)))
{
diff[k] = o2[k];
}
}
for (k in diff)
{
if (diff.hasOwnProperty(k))
{
return diff;
}
}
return false;
}
{
"Amount": 500001,
"Borrowers": [
{
"FirstName": "Don",
"Employment": [
{
"Income": [
{
"MonthlyIncome": 500,
"Type": "Other"
}
]
}
]
}
]
}
{
"Amount": 500001,
"Borrowers": {
"0": {
"FirstName": "Don",
"Employment": {
"0": {
"Income": {
"1": {
"MonthlyIncome": 500,
"Type": "Other"
}
}
}
}
}
}
}
我对您试图做的事情有点困惑,但如果使用lodash,是否有帮助
function difference(o1, o2) {
var k;
var kDiff;
var diff = {};
for (k in o1)
{
if (!o1.hasOwnProperty(k)) { }
else if (typeof o1[k] != 'object' || typeof o2[k] != 'object')
{
if (!(k in o2) || o1[k] !== o2[k]){
diff[k] = o2[k];
}
} else if (kDiff = difference(o1[k], o2[k]))
{
diff[k] = kDiff;
}
}
for (k in o2)
{
if (o2.hasOwnProperty(k) && (!o1 || !(k in o1)))
{
diff[k] = o2[k];
}
}
for (k in diff)
{
if (diff.hasOwnProperty(k))
{
return diff;
}
}
return false;
}
根据@Kaddath的提示,返回的差异必须根据要计算的对象类型定义:
function difference(o1, o2) {
var k;
var kDiff;
var diff = {};
for (k in o1)
{
if (!o1.hasOwnProperty(k)) { }
else if (typeof o1[k] != 'object' || typeof o2[k] != 'object')
{
if (!(k in o2) || o1[k] !== o2[k]){
diff[k] = o2[k];
}
} else if (kDiff = difference(o1[k], o2[k]))
{
diff[k] = kDiff;
}
}
for (k in o2)
{
if (o2.hasOwnProperty(k) && (!o1 || !(k in o1)))
{
diff[k] = o2[k];
}
}
for (k in diff)
{
if (diff.hasOwnProperty(k))
{
return diff;
}
}
return false;
}
功能差异(o1,o2){
function difference(o1, o2) {
var k;
var kDiff;
var diff = {};
for (k in o1)
{
if (!o1.hasOwnProperty(k)) { }
else if (typeof o1[k] != 'object' || typeof o2[k] != 'object')
{
if (!(k in o2) || o1[k] !== o2[k]){
diff[k] = o2[k];
}
} else if (kDiff = difference(o1[k], o2[k]))
{
diff[k] = kDiff;
}
}
for (k in o2)
{
if (o2.hasOwnProperty(k) && (!o1 || !(k in o1)))
{
diff[k] = o2[k];
}
}
for (k in diff)
{
if (diff.hasOwnProperty(k))
{
return diff;
}
}
return false;
}
}只是提示:
typeof[]
返回“object”而不是“array”(改用)。然后定义diff={}
这样这里就不能有数组了..我不知道lodash中的这个功能。我还有另一个要求,即如果对象中的任何其他字段值发生更改,则始终包括“Id”字段和值。使用lodash transform有办法做到这一点吗?@ddrjca您在函数(结果、值、键)
中有键和值
,因此,是的,您只需要测试键是否=='Id'
,如果是这样的话,就将其分配给结果
function difference(o1, o2) {
var k;
var kDiff;
var diff = {};
for (k in o1)
{
if (!o1.hasOwnProperty(k)) { }
else if (typeof o1[k] != 'object' || typeof o2[k] != 'object')
{
if (!(k in o2) || o1[k] !== o2[k]){
diff[k] = o2[k];
}
} else if (kDiff = difference(o1[k], o2[k]))
{
diff[k] = kDiff;
}
}
for (k in o2)
{
if (o2.hasOwnProperty(k) && (!o1 || !(k in o1)))
{
diff[k] = o2[k];
}
}
for (k in diff)
{
if (diff.hasOwnProperty(k))
{
return diff;
}
}
return false;
}