JavaScript-“;“查询”;物件
我想要一种纯JavaScript方式来“查询”对象。对象如下所示JavaScript-“;“查询”;物件,javascript,arrays,Javascript,Arrays,我想要一种纯JavaScript方式来“查询”对象。对象如下所示 [ { "Name": "testName1", "Date : "01/01/2016", "Volume1 : 1234 "Volume2 : 1234 }, { "Name": "testName1", "Date : "01/01/2016", "Volume1 : 5678
[
{
"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
}
]
我在这里的目标是能够访问每个的卷,但需要访问特定名称和日期的卷。换句话说,我想返回日期为“2016年1月1日”且带有“testName1”的任何内容的总卷1
我试图通过向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;
}
}
在我的for循环中;然而,这并不区分日期和名称
我在这里的想法是以某种方式循环我的唯一值数组,并在满足某些标准的地方收集值,但我很难将其编码
我还想知道是否有一种更简洁的方法来做到这一点 首先,你的javascript和json是一团糟。大量缺少引号和不匹配的括号
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循环,以根据您给定的谓词执行特定操作(谓词是返回布尔值的函数)
例如,filter()可以替换为如下所示的for循环
var output = [];
for(var x in array) {
if(predicate(array[x])) {
output.push(array[x]);
}
}
return output;
当您使用for循环时,有时最好将您的想法分解为每个循环的单个任务。它的效率较低(在执行中),但它可以帮助您将想法分解为可管理的部分。一旦你真正理解了你的代码,你就可以试着把它们合并回一个循环。这可能是重复的。我使用了你的建议和我的想法的混合体。工作完美。不知道.filter方法。因为json每天都会改变,所以我首先循环抛出以找出唯一的日期。然后在应用.filter时遍历这些日期以计算所需的卷,并将这些值附加到单独的数组中。现在,我可以通过在任意一个数组上使用相同的索引来匹配日期和卷。我可以尝试将这两个元素组合成一个键:值数组。再次感谢,这真的帮助我思考了代码。
var output = [];
for(var x in array) {
if(predicate(array[x])) {
output.push(array[x]);
}
}
return output;