【问题标题】:Is there a way to add/subtract all fields inside a JSON with another object with the same fields?有没有办法用另一个具有相同字段的对象添加/减去 JSON 中的所有字段?
【发布时间】:2015-04-16 05:51:23
【问题描述】:

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

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

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

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

【问题讨论】:

  • 解构可能会做你想做的事(我不确定我是否正确)。 developer.mozilla.org/de/docs/Web/JavaScript/Reference/… 不过还没有引入(ES6):$
  • 您能否提供两个示例输入对象和您想要获得的输出对象?例如,我不清楚字符串属性会发生什么。他们会从结果中被忽略吗?
  • 对不起,我意识到我不够清楚。我稍微编辑了这个问题。我只是想取两个具有上述格式的对象并将它们的数字相加。
  • 您可以通过编写一个遍历对象的每个属性的函数来避免手动维护它,如果 typeof === "number",请检查另一个对象是否具有该属性(并且 typeof = == "number") 并将它们相加。
  • @LexJacobs 我想我可以做到。因此,如果我偶然发现 object 类型,我应该遍历它并寻找匹配项?

标签: javascript json node.js


【解决方案1】:

很简单。这是一个通用计算函数,它从 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 calculate 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.

编辑#1

现在,在我考虑了一分钟之后,您可能想要做的是在您的 JSON 中实现一个您的架构旅行者将识别的自定义类型:

{ 
"customCalc":true,
"operation":"subtract",
"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);
    }
 }

【讨论】:

  • 谢谢!我正要根据某人的建议写出类似这样的完全的东西。我会尽快测试一下。
  • 只需点击运行code snippet 并检查控制台 ;-) 你可以看到它巧妙地将所有内容都降到了 0。我还添加了一个可能适合你需要的额外建议
猜你喜欢
  • 2018-07-20
  • 2018-07-30
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多