Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-“;“查询”;物件_Javascript_Arrays - Fatal编程技术网

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

我想要一种纯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
    }
]
我在这里的目标是能够访问每个的卷,但需要访问特定名称和日期的卷。换句话说,我想返回日期为“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;