Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 - Fatal编程技术网

Javascript如何高效地过滤和访问数组数组?

Javascript如何高效地过滤和访问数组数组?,javascript,Javascript,我有一个这种格式的数组 var data = [ "Author Name: Employee1" ], [ "Earnings", "Amount", "Deductions", "Amount", "Take Home"

我有一个这种格式的数组

    var data = [
                 "Author Name: Employee1"
               ],
               [
                 "Earnings",
                 "Amount",
                 "Deductions",
                 "Amount",
                 "Take Home"
               ],
               [
                 "Regular",
                 "2,500.00",
                 "Coop Loan",
                 "1,500.00"
               ],
                [
                 "Author Name: Employee2"
               ],
               [
                 "Earnings",
                 "Amount",
                 "Deductions",
                 "Amount",
                 "Take Home"
               ],
               [
                 "Regular",
                 "3,500.00",
                 "Coop Loan",
                 "1,500.00"
               ],
我正在尝试获取
常规
数组
旁边的值,即金额[“2500”,“3500”]

我首先做的是过滤数组

$.each(data, function(a,b){ // loop 1
    earnings_list = b.filter(function(z){ 
        if(/^Regular/.test(z) == true) 
        {
            $.each(data, function(x,y){ // loop 2
                 if(x == a) // compare if keys matches
                 {
                   console.log("key: "+a+"  amount: "+y[1]);
                 }
            });
         }
     });  
}); 
输出为

key: 2 amount: 2,500
key: 5 amount: 3,500
在这个循环中,我能够得到常规的
金额[“2500”,“3500”]
但是,我重复我自己,我有两个相同数据的循环,只是为了比较它的键

我有成百上千的字段和记录要过滤,这可能会减慢处理速度,我必须对此进行返工

我希望有人能给我建议如何优化我的代码而不重复我的循环,谢谢

来自评论

我的预期输出是一个数组,显示作者姓名:User和Author 姓名:User2

您可以使用
reduce
(以获得展平的数组)和
filter

var search = "Author Name";
var output = arr.reduce( ( a, c ) => a.concat(c), [] ).filter( s => s && s.indexOf( search ) != -1 );
演示

var-arr=[
[
“要求列表”
],
[
“系统名称:测试”
],
[
“程序/模块名称:测试”
],
[
“作者姓名:用户”,
无效的
“Sap编号:7774”
],
[
“收入”,
“金额”,
“扣除额”,
“金额”,
“带回家”
],
[
“常规”,
"2,500.00",
“合作社贷款”,
"1,500.00"
],
[
“加班”,
"1,500.00",
“税收”,
"2,200.00"
],
[
“假日”,
"700.00",
“健身房”,
"0.00"
],
[
“奖金”,
"1,000.00"
],
[
“生日”,
"0.00"
],
[
“总收入”,
"5,700.00",
“扣除总额”,
"3,700.00",
"2,000.00"
],
[
“系统名称:ETEASDASr”
],
[
“程序/模块名称:EAASDA”
],
[
“作者姓名:USER2”,
无效的
“Sap编号:7774”
],
[
“收入”,
“金额”,
“扣除额”,
“金额”,
“带回家”
],
[
“常规”,
"3,500.00",
“合作社贷款”,
"1,500.00"
],
[
“加班”,
"1,500.00",
“税收”,
"2,200.00"
],
[
“假日”,
"700.00",
“健身房”,
"0.00"
],
[
“奖金”,
"1,000.00"
],
[
“生日”,
"0.00"
],
[
“总收入”,
"6,700.00",
“扣除总额”,
"3,700.00",
"3,000.00"
],
];
var search=“作者姓名”;
var输出=arr.reduce((a,c)=>a.concat(c),[])。过滤器(s=>s&&s.indexOf(search)!=-1);

控制台日志(输出)您可以使用reduce来获得所需的值,我已经减少了示例数据。将正则表达式存储为变量可能有助于提高性能:

var数据=[
[
“要求列表”
],
[
“作者姓名:用户”,
无效的
“Sap编号:7774”
],
[
“常规”,
"3,500.00",
“合作社贷款”,
"1,500.00"
],
[
“作者姓名:USER2”,
无效的
“Sap编号:7774”
]
]
//循环数据内容
var authors=data.reduce(函数(acc、arr){
//获取以“Author Name”开头并附加到累加器的元素
返回acc.concat(arr.filter(函数){return/^Author Name:/.test});
}, []);
console.log(作者);
//使用箭头功能:
var authors2=data.reduce((acc,arr)=>acc.concat(arr.filter(s=>/^Author Name:/.test)),[]);

console.log(authors2)您可以通过检查项来采取迭代和递归的方法,如果它是一个数组,则调用,然后对数组进行回调。如果没有,请检查该值并将其连接到结果集(如果包括)

var数据=[“需求列表”]、[“系统名称:测试”]、[“程序/模块名称:测试”]、[“作者姓名:用户”、“Sap编号:7774”]、[“收入”、“金额”、“扣除额”、“金额”、“带回家”]、[“常规”、“2500.00”、“合作贷款”、“1500.00”]、[“加班”、“1500.00”、“税收”、“2200.00”]、[“假期”、“700.00”、“健身房”、“0.00”]、[“奖金”,“1000.00”],[“生日”,“0.00”],[“总收入”,“5700.00”,“总扣除额”,“3700.00”,“2000.00”],[“系统名称:ETEASDASr”],[“程序/模块名称:EAASDA”],[“作者姓名:USER2”,空,“Sap编号:7774”],[“收入”,“金额”,“扣除额”,“带回家”],[“常规”,“3500.00”,“合作社贷款”,“1500.00”],[“加班”,“1500.00”、“税收”、“2200.00”]、[“假期”、“700.00”、“健身房”、“0.00”]、[“奖金”、“1000.00”]、[“生日”、“0.00”]、[“总收入”、“6700.00”、“总扣除额”、“3700.00”、“3000.00”],
搜索='作者姓名',
结果=数据.reduce(函数iter(r,a){
返回数组.isArray(a)
?a.减少(国际热核实验堆,国际热核实验堆)
:r.concat((''+a).包括(搜索)?a:[]);
}, []);

console.log(result);
您有一个数组,而不是对象数组。关于示例代码的结构和您所问问题的实际文本,这个问题存在一些严重问题。无论如何,只需使用
indexOf(stringName)>-1
而不是
==stringName
…也就是说,一旦您知道如何将其放入对象数组而不是数组中,语法就无效了。请提供您的代码、有效的输入和所需的输出。您期望的输出是什么?可能是像
/^Author Name/.test(值)这样的正则表达式
如果值以“Author Name:”字符开头,它将返回true。@RobG我将不得不在
reduce
回调中循环
c
。它将变得更混乱,更难阅读。目前的方法看起来更干净。