Javascript 嵌套JSON值的总和
我试图从服务器返回的一组JSON数据中获取以下不同状态值的总和。当值没有嵌套时,我的javascript工作正常,但不幸的是,我需要的数据嵌套在每个对象中 从下面的代码中,我尝试返回警报中的值2(两个对象的值为“接触”,权重为1) 使用“status.status”和“status.Weighting”来获取数据并不像预期的那样有效。我非常感激你对我的帮助Javascript 嵌套JSON值的总和,javascript,json,Javascript,Json,我试图从服务器返回的一组JSON数据中获取以下不同状态值的总和。当值没有嵌套时,我的javascript工作正常,但不幸的是,我需要的数据嵌套在每个对象中 从下面的代码中,我尝试返回警报中的值2(两个对象的值为“接触”,权重为1) 使用“status.status”和“status.Weighting”来获取数据并不像预期的那样有效。我非常感激你对我的帮助 function showAlert() { var requests = [ { "contactNum
function showAlert() {
var requests =
[ { "contactNumber": "098989 258855",
"createdDate": 1443861343172,
"firstName": "Ralph",
"notes": "First time buyer",
"status": {
"Id": 1,
"Status": "Referred",
"Weighting": "2"
},
"surname": "Green",
"title": "Mr",
"updatedDate": 1443861343172
},
{ "contactNumber": "9999999999",
"createdDate": 1444728401230,
"firstName": "Sean",
"notes": "Landlord",
"status": {
"Id": 5,
"Status": "Application made",
"Weighting": "5"
},
"surname": "Jackson",
"title": "Mr",
"updatedDate": 1444728401230
},
{ "contactNumber": "9999999999",
"createdDate": 1444728476347,
"firstName": "Sam",
"notes": "Remortgage",
"status": {
"Id": 2,
"Status": "Contacted",
"Weighting": "1"
},
"surname": "Jenkins",
"title": "Miss",
"updatedDate": 1444728476347
},
{ "contactNumber": "9999999999",
"createdDate": 1444728476347,
"firstName": "Grace",
"notes": "Remortgage",
"status": {
"Id": 2,
"Status": "Contacted",
"Weighting": "1"
},
"surname": "Jones",
"title": "Miss",
"updatedDate": 1444728476347
},
];
var sumByKey = function (array, keyField, keyValue, valueField) {
var sum = 0;
for (var i = 0, len = array.length; i < len; i++)
if (array[i][keyField] == keyValue)
sum += parseFloat(array[i][valueField])
return sum;
}
alert(sumByKey(requests, "status.Status", "Contacted", "status.Weighting"));}
函数showAlert(){
var请求=
[{“联系人号码”:“098989258855”,
“createdDate”:1443861343172,
“名字”:“拉尔夫”,
“注意事项”:“首次买家”,
“地位”:{
“Id”:1,
“状态”:“已提交”,
“权重”:“2”
},
“姓”:“绿”,
“头衔”:“先生”,
“更新日期”:1443861343172
},
{“联系人号码”:“99999999”,
“createdDate”:1444728401230,
“名字”:“肖恩”,
“备注”:“业主”,
“地位”:{
“Id”:5,
“状态”:“提出申请”,
“权重”:“5”
},
“姓氏”:“杰克逊”,
“头衔”:“先生”,
“更新日期”:1444728401230
},
{“联系人号码”:“99999999”,
“createdDate”:1444728476347,
“名字”:“山姆”,
“注释”:“再抵押”,
“地位”:{
“Id”:2,
“状态”:“已联系”,
“权重”:“1”
},
“姓氏”:“詹金斯”,
“头衔”:“小姐”,
“更新日期”:1444728476347
},
{“联系人号码”:“99999999”,
“createdDate”:1444728476347,
“名字”:“格雷斯”,
“注释”:“再抵押”,
“地位”:{
“Id”:2,
“状态”:“已联系”,
“权重”:“1”
},
“姓氏”:“琼斯”,
“头衔”:“小姐”,
“更新日期”:1444728476347
},
];
var sumByKey=函数(数组、键域、键值、值域){
var总和=0;
对于(变量i=0,len=array.length;i
您必须执行以下操作,拆分外部和内部对象键值:
var sumByKey = function (array, outerKeyField, innerKeyField, keyValue, outerValueField, innerValueField) {
var sum = 0;
for (var i = 0, len = array.length; i < len; i++)
if (array[i][outerKeyField][innerKeyField] == keyValue)
sum += parseFloat(array[i][outerValueField][innerValueField])
return sum;
}
或者,只要检测到带有点符号的键,就必须向函数中添加一些字符串解析,并相应地更改逻辑
这样的事情应该行得通:
var sumByKey = function(array, keyField, keyValue, valueField) {
var sum = 0;
var thisKey = "";
var thisValue = "";
for (var i = 0, len = array.length; i < len; i++) {
if (keyField.indexOf(".") > -1) {
var keys = keyField.split(".");
var obj = array[i][keys[0]];
for (var j = 1, keyLen = keys.length; j < keyLen; j++) {
obj = obj[keys[j]];
}
thisKey = obj;
} else {
thisKey = keyField;
}
if (thisKey == keyValue) {
if (valueField.indexOf(".") > -1) {
var vals = valueField.split(".");
obj = array[i][vals[0]];
for (var j = 1, valLen = vals.length; j < valLen; j++) {
obj = obj[vals[j]];
}
thisValue = obj;
} else {
thisValue = array[i][valueField];
}
sum += parseFloat(thisValue)
}
}
return sum;
}
var sumByKey=函数(数组、键域、键值、值域){
var总和=0;
var thisKey=“”;
var thisValue=“”;
对于(变量i=0,len=array.length;i-1){
var keys=keyField.split(“.”);
var obj=数组[i][key[0]];
对于(var j=1,keyLen=keys.length;j
var示例=[{
“地位”:{
“状态”:“已联系”,
“重量”:1
}
}, {
“地位”:{
“状态”:“已联系”,
“重量”:1
}
}, {
“地位”:{
“状态”:“已忽略”,
“重量”:1
}
}];
var sumByKey=函数(数组、键域、键值、值域){
var总和=0;
var thisKey=“”;
var thisValue=“”;
对于(变量i=0,len=array.length;i-1){
var keys=keyField.split(“.”);
var obj=数组[i][key[0]];
对于(var j=1,keyLen=keys.length;j 警报(sumByKey(例如,“status.status”、“contacted”、“status.weight”)代码>您仍然可以使用点符号执行类似的操作。这是一张工作票
不能在括号内使用点符号notation@JoshKG是的,他可以,但不会有他想要的结果。这并不是一个非常武断的解决方案。如果他有超过一级的深键,比如a.b.c.d
?@Olander是的,我在发布后就想到了这一点。此后,它被编辑为一个基本的例子,解析一个点符号字符串。编辑:啊,我看到你用自己的答案打败了我!
var sumByKey = function(array, keyField, keyValue, valueField) {
var sum = 0;
var thisKey = "";
var thisValue = "";
for (var i = 0, len = array.length; i < len; i++) {
if (keyField.indexOf(".") > -1) {
var keys = keyField.split(".");
var obj = array[i][keys[0]];
for (var j = 1, keyLen = keys.length; j < keyLen; j++) {
obj = obj[keys[j]];
}
thisKey = obj;
} else {
thisKey = keyField;
}
if (thisKey == keyValue) {
if (valueField.indexOf(".") > -1) {
var vals = valueField.split(".");
obj = array[i][vals[0]];
for (var j = 1, valLen = vals.length; j < valLen; j++) {
obj = obj[vals[j]];
}
thisValue = obj;
} else {
thisValue = array[i][valueField];
}
sum += parseFloat(thisValue)
}
}
return sum;
}
var sumByKey = function (array, keyField, keyValue, valueField) {
var sum = 0;
var keyFieldSplits = keyField.split(".");
var valueFieldSplits = valueField.split(".");
array.forEach(function(value){
var start = value;
keyFieldSplits.forEach(function(key){
start = start[key];
});
if(start == keyValue) {
start = value;
valueFieldSplits.forEach(function(key){
start = start[key];
});
sum += parseInt(start, 10);
}
});
return sum;
}
alert(sumByKey(requests, "status.Status", "Contacted", "status.Weighting"));