Javascript 如何计算主干中集合中特定模型(属性)的总和
我是主干网新手,面临一个问题,我需要在我的收藏中计算我的模型的具体值Javascript 如何计算主干中集合中特定模型(属性)的总和,javascript,backbone.js,backbone.js-collections,Javascript,Backbone.js,Backbone.js Collections,我是主干网新手,面临一个问题,我需要在我的收藏中计算我的模型的具体值 // Profit Model var Profit = Backbone.Model.extend({}); // Asset Model var Asset = Backbone.Model.extend({ parse: function(resp) { if (resp.grossProfit) { this.profit = new Profit(resp.grossProfit);
// Profit Model
var Profit = Backbone.Model.extend({});
// Asset Model
var Asset = Backbone.Model.extend({
parse: function(resp) {
if (resp.grossProfit) {
this.profit = new Profit(resp.grossProfit);
delete resp.grossProfit;
}
return resp;
}
});
// Assets Collection
var Assets = Backbone.Collection.extend({
model: Asset
});
// Account Model
var Account = Backbone.Model.extend({
idAttribute: 'accountNumber',
parse: function(resp) {
if (resp.assets) {
this.assets = new Assets(resp.assets, {
parse: true
});
delete resp.assets;
}
return resp;
}
});
// Accounts Collections
var Accounts = Backbone.Collection.extend({
model: Account,
getTotals: function() {
var acquisitionCost = 0;
var units = 0;
var netGainLoss = 0;
// iterate over the accounts collections
this.each(function(account) {
// iterate over assets collections for each account
account.assets.each(function(asset) {
var profit = asset.profit;
if (profit) {
acquisitionCost += parseInt(profit.get('acquisitionCost'), 10);
units += parseInt(profit.get('units'), 10);
netGainLoss += parseInt(profit.get('netGainLoss'), 10);
}
});
});
return {
acquisitionCost: acquisitionCost,
units: units,
netGainLoss: netGainLoss
};
}
});
var data = {
"accounts": [{
"accountNumber": "AS10000642",
"assets": {
"assetName": "ABCDEF GHIJKLM",
"isin": "GB0008533564",
"grossProfit": {
"acquisitionCost": "500",
"units": "10",
"netGainLoss": "20"
}
}
}, {
"accountNumber": "AS100006423",
"assets": {
"assetName": "ABCDEF GHIJKLM",
"isin": "GB0008533564",
"grossProfit": {
"acquisitionCost": "1000",
"units": "10",
"netGainLoss": "20"
}
}
}, {
"accountNumber": "AS10000407",
"assets": {
"assetName": "ABCDEF GHIJKLM",
"isin": "GB0008533564",
"grossProfit": {
"acquisitionCost": "400",
"units": "10",
"netGainLoss": "20"
}
}
}]
};
var accounts = new Accounts(data.accounts, {
parse: true
});
var getTotalData = accounts.getTotals();
console.log("Total acqisition cost - " + getTotalData.acquisitionCost);
console.log("Total units - " + getTotalData.units);
console.log("Total net gain loss - " + getTotalData.netGainLoss);
为了便于参考,我正在粘贴帐户集合,从中我需要计算所有模型的购置成本、单位和净收益之和
i、 e在计算acquisitionCost之后,我应该得到:1900,我们需要注意的一件事是,值以字符串形式出现,如JSON中所示
{
"accounts": [{
"accountNumber": "AS10000642",
"assets": [{
"assetName": "ABCDEF GHIJKLM",
"isin": "GB0008533564",
"grossProfit": [{
"acquisitionCost": "500",
"units": "10",
"netGainLoss": "20"
}]
}]
},
{
"accountNumber": "AS10000642",
"assets": [{
"assetName": "ABCDEF GHIJKLM",
"isin": "GB0008533564",
"grossProfit": [{
"acquisitionCost": "1000",
"units": "10",
"netGainLoss": "20"
}]
}]
},
{
"accountNumber": "AS10000407",
"assets": [{
"assetName": "ABCDEF GHIJKLM",
"isin": "GB0008533564",
"grossProfit": [{
"acquisitionCost": "400",
"units": "10",
"netGainLoss": "20"
}]
}]
}
]
}
主干网的一个令人困惑的部分是,一个特定的实现可以以无数种方式完成,但仍然可以是正确的。因此,开发人员可以选择最佳的方法,以确保其模块化和可扩展,以供将来使用 由于显示的数据是深度嵌套的,因此最好将它们组织到集合或模型上的集合和模型中。通过这种方式,它可以很容易地进行操作,并在上面不断添加更多功能。你可以把一个模型想象成一个monthership账户,较小的船舶依靠该账户生存资产或利润。按照这个结构,我们得到了这个模式 还需要确保帐号是唯一的,否则,重复的帐号将不会添加到集合中
// Profit Model
var Profit = Backbone.Model.extend({});
// Asset Model
var Asset = Backbone.Model.extend({
parse: function(resp) {
if (resp.grossProfit) {
this.profit = new Profit(resp.grossProfit);
delete resp.grossProfit;
}
return resp;
}
});
// Assets Collection
var Assets = Backbone.Collection.extend({
model: Asset
});
// Account Model
var Account = Backbone.Model.extend({
idAttribute: 'accountNumber',
parse: function(resp) {
if (resp.assets) {
this.assets = new Assets(resp.assets, {
parse: true
});
delete resp.assets;
}
return resp;
}
});
// Accounts Collections
var Accounts = Backbone.Collection.extend({
model: Account,
getTotals: function() {
var acquisitionCost = 0;
var units = 0;
var netGainLoss = 0;
// iterate over the accounts collections
this.each(function(account) {
// iterate over assets collections for each account
account.assets.each(function(asset) {
var profit = asset.profit;
if (profit) {
acquisitionCost += parseInt(profit.get('acquisitionCost'), 10);
units += parseInt(profit.get('units'), 10);
netGainLoss += parseInt(profit.get('netGainLoss'), 10);
}
});
});
return {
acquisitionCost: acquisitionCost,
units: units,
netGainLoss: netGainLoss
};
}
});
var data = {
"accounts": [{
"accountNumber": "AS10000642",
"assets": {
"assetName": "ABCDEF GHIJKLM",
"isin": "GB0008533564",
"grossProfit": {
"acquisitionCost": "500",
"units": "10",
"netGainLoss": "20"
}
}
}, {
"accountNumber": "AS100006423",
"assets": {
"assetName": "ABCDEF GHIJKLM",
"isin": "GB0008533564",
"grossProfit": {
"acquisitionCost": "1000",
"units": "10",
"netGainLoss": "20"
}
}
}, {
"accountNumber": "AS10000407",
"assets": {
"assetName": "ABCDEF GHIJKLM",
"isin": "GB0008533564",
"grossProfit": {
"acquisitionCost": "400",
"units": "10",
"netGainLoss": "20"
}
}
}]
};
var accounts = new Accounts(data.accounts, {
parse: true
});
var getTotalData = accounts.getTotals();
console.log("Total acqisition cost - " + getTotalData.acquisitionCost);
console.log("Total units - " + getTotalData.units);
console.log("Total net gain loss - " + getTotalData.netGainLoss);
为什么不在集合上迭代并将值相加呢?你试过什么吗?到底是什么阻止了你?我不知道怎么做。如果你能帮助我,那就太好了,因为我需要计算所有模型的acquisitionCost、units和netGainLoss的所有值。请做一些基础研究,比如如何循环主干收集,以及如何从主干模型访问属性,并诚实地尝试解决问题。请阅读我自己尝试过的,但是模型结构有点深,所以无法完成,否则我就不会发布到stackoverflow和。解析不应该有副作用,在这种情况下使用delete是低效和不必要的。除此之外,在不太大的集合上实例化这样一个嵌套的模型结构将使浏览器的运行速度降低到几百次左右。@emilebergron使用delete的原因是将数据作为实际帐户属性散列的一部分删除,这不再是必需的,因为它直接存在于模型上。嵌套结构的主要目的是保持其组织性,并在必要时抓住它们。目前,OP的req是微不足道的,计算计数。但是如果更多的道具添加了额外的功能会怎么样呢。如果嵌套的道具一直存在于account attr hash上,那么操作会变得复杂,因为我们一直在处理对象和模型数据是的,我完全明白,要处理数据,在视图中使用数据等等,复杂的结构会很好,但即使这样,我也会采用惰性init方式或计算属性。在我们这里的例子中,它超出了范围。----------非常感谢sushanth的帮助,但是你能做一件事吗?我需要检查基于accountNumber的重复模型,并需要合并这些模型的资产。示例:假设我们有两个具有相同帐号的模型,那么我们将查找这些资产并将它们合并为一个。我们可以在示例中这样做吗?如果您共享代码,这将非常好。谢谢