有没有办法用另一个具有相同字段的对象添加/减去JSON中的所有字段?

时间:2015-04-16 05:51:24

标签: javascript json node.js

我有一个Mongoose.js架构,如下所示:

{
  "City": String,
  "Year": String,
  "Population": Number,
  "Blah": Number,
  "Nested": {
    "Something": Number,
    "More stuff": Number 
  }
}

是否有方便/最好的方法来获取这些字段的两个对象并添加它们的数字字段,或者我是否需要编写一个函数来实际进入并执行此操作?

我在这里处理一个非常大的架构。如果我写一个函数来执行此操作,我将不得不手动维护它;这意味着如果我更改架构,我将不得不手动更改我定义的成员函数来添加内容。

1 个答案:

答案 0 :(得分:2)

很简单。 这是一个通用计算函数,它从schema1中减去schema2并返回一个新对象。

它只用于匹配同一级别的对象。如果一个模式有一个属性但另一个模式没有被忽略。

如果它们是数字和有效数字,则为schema1 - schema2

如果它们是对象,我们需要更深入。

在所有类型声明中,schema1处于领先地位,并假设schema2将遵循。在那种情况下,我将面临可怕的灾难和绝望。您可以自行测试所需的所有类型。我只建立了一些安全措施。



json1 = {
  City: "Amsterdam",
  Year: "2000",
  Population: 100,
  brutProduce: 10000,
  losses: {
    devalue: 10000,
    damages: 1000 
  }
}
json2 = {
  City: "Amsterdam",
  Year: "2003",
  Population: 100,
  brutProduce: 10000,
  losses: {
    devalue: 10000,
    damages: 1000 
  }
}

//Only cacluate number types
function calculate(schema1,schema2) {
  var ret = {};
  for (var key in schema1) {
   if (schema1.hasOwnProperty(key) && schema2.hasOwnProperty(key)) {
       var obj = schema1[key];
       var obj2 = schema2[key]
       if(typeof obj === "number" && !isNaN(obj) && typeof obj2 === "number" && !isNaN(obj2)) {
         ret[key] = obj-obj2;
       }
       else {
         if(typeof obj === 'object' && typeof obj2 === 'object') {
           ret[key] = calculate(obj,obj2);
         }
         else {
           ret[key] = obj;
         }
       }
     }
    }
  return ret;
  }
test = calculate(json1,json2);
console.log(test);

Please check console for the output. thank you.




修改 现在,在我给你一分钟的考虑之后,你可能想要做的是在json中实现一个自定义类型,你的架构旅行者会识别

{ 
"customCalc":true,
"operation":"substract",
"value":1000
}

然后,当您找到typeof obj === 'object'时,您可以使用简单的hasownProperty来测试customCalc的存在性

 if(typeof obj === 'object') {
    if(obj.hasOwnProperty('customCalc')) {
        switch(obj.operation) {
            case 'substract':ret=obj.value-obj2.value;break;
            case 'add':      ret=obj.value+obj2.value;break;
            case 'divide':   ret=obj.value/obj2.value;break;
            case 'multiply': ret=obj.value*obj2.value;break;
        }
    }
    else {
       ret[key] = calculate(obj,obj2);
    }
 }