我想要一种纯粹的JavaScript方式来查询"查询"一个东西。对象如下所示。
[
{
"Name": "testName1",
"Date : "01/01/2016",
"Volume1 : 1234
"Volume2 : 1234
},
{
"Name": "testName1",
"Date : "01/01/2016",
"Volume1 : 5678
"Volume2 : 5678
},
{
"Name": "testName1",
"Date : "01/02/2016",
"Volume1 : 1234
"Volume2 : 1234
},
{
"Name": "testName2",
"Date : "01/01/2016",
"Volume1 : 1234
"Volume2 : 1234
},
{
"Name": "testName2",
"Date : "01/02/2016",
"Volume1 : 1234
"Volume2 : 1234
}
]
我的目标是能够访问每个卷,但需要针对特定的名称和日期进行访问。换句话说,我希望以" testName1"返回任何内容的总Volume1。并在日期" 01/01/2016"。
我尝试通过将值附加到JavaScript数组来实现此目的:
var dateArray =[];
var nameArray = [];
for (var i = 0; i < obj.length; i++) {
if (contains(dateArray,obj[i].date == false) { // contains is a function that checks if an item exists in an array
dateArray.push(obj[i].date;
}
}
然后,我通过在名称数组中附加唯一值来对名称执行相同的操作。
我可以通过添加:
来获得数量volume += obj[i][Volume1]
在我的for循环中;但是,这并不区分日期和名称。
我的思想形式是以某种方式循环遍历我的独特值数组,并在满足某些条件的情况下收集值,但我很难将其放入代码中。
我也想知道是否有更简洁的方法来做到这一点。
答案 0 :(得分:2)
首先关闭你的javascript和json是一团糟。很多缺失的行情和不匹配的括号。
new public static ICollection<string> AllKeys
{
get
{
return BaseEnum.AllKeys;
}
}
这些函数调用中的每一个基本上都是执行for循环,以根据您给出的谓词执行特定操作(谓词是一个返回布尔值的函数)。
例如,filter()可以替换为看起来像这样的for循环。
var arr = [ /*your array*/ ];
var total = arr
//filters so only items with .name === "testName1" remain
.filter(function(x) { return x.name === "testName1"; })
//filters so only items with .date === "01/01/2016" remain
//this could be replaced with a more robust date check
.filter(function(x) { return x.date === "01/01/2016"; })
//sums up all of the values of Volume1 of the remaining items.
.reduce(function(prev, curr, index) { return prev + curr.Volume1;});
当您使用for循环时,有时最好将您的想法分解为每个循环的单个任务。效率较低(执行中)但它可以帮助您将您的想法分解为可管理的块。然后,一旦你真正理解了你的代码,你可以尝试将它们合并回一个循环。