【问题标题】:Add dynamic filter with javascript find method使用 javascript find 方法添加动态过滤器
【发布时间】:2023-01-19 23:05:42
【问题描述】:
Input :

    First Array
    const input1 = [
    {
    'name':"name1",
    'email':"emai2@email.com",
    'age':10
    },
    {
    'name':"name2",
    'email':"emai2@email.com",
    'age':20
    }
    
    ];
    Second Array
    const input2 =[
    {
    'fullname':"name1",
    'emailaddress':"emai2@email.com",
    'age':10
    },
    {
    'name':"name2",
    'email':"emai2@email.com",
    'age':20
    }
    
    ];
    const filter1 = ['name', 'email'];
    const filter2 = ['fullname','emailaddress'];
    const matchArray = [];
    const newArray = [];
    let filterInput ='';
    
    function filterRecord(input1, input2, filter1, filter2) {
    filter1.forEach((data, index) =>{
    if((filter1.lenght)-1 ==index)){
    filterInput +='obj['+data+']==='+input2[index]+']';
    }
    
    else {
    if((filter1.lenght)-1 ==index)){
    filterInput +='obj['+data+']==='+input2[index]+'] && ';
    }
    });
     input1.forEach((data, index) =>{
    const isExist = input2.find((obj) =>filterInput);
     if(isExist){
       matchArray.push(isexist);
}
else {
newArray.push(isexist);
}
});
return {matchArray, newArray}
}

过滤器记录(输入 1、输入 2、过滤器 1、过滤器 2)

所以我需要检查两个数组的键是动态的。上面的代码没有按预期工作。匹配记录应该压入matchArray,不匹配的记录应该压入newArray。但是目前我在 find 中传递的过滤器输入不起作用

【问题讨论】:

    标签: javascript node.js javascript-objects


    【解决方案1】:

    您提供的代码未按预期工作,因为在 filterRecord 函数中,未正确构造 filterInput 变量。您正在使用 filter1 数组构造 filterInput 变量,但您正试图访问 input2 数组中的值。此外,您使用单个等号进行比较,这对于比较两个变量是不正确的。

    这是更新函数以正确过滤记录的一种方法:

    function filterRecord(input1, input2, filter1, filter2) {
        let filterInput = '';
        filter1.forEach((data, index) => {
            if (index === (filter1.length - 1)) {
                filterInput += `obj.${data} === data.${filter2[index]}`;
            } else {
                filterInput += `obj.${data} === data.${filter2[index]} && `;
            }
        });
    
        input1.forEach(data => {
            const isExist = input2.find(obj => eval(filterInput));
            if (isExist) {
                matchArray.push(isExist);
            } else {
                newArray.push(data);
            }
        });
        return { matchArray, newArray };
    }
    

    在此更新版本中,通过迭代 filter1 数组并使用 filter2 数组中的相应值进行比较来构造 filterInput 变量。它不是使用单个等号,而是使用三个等号进行比较,这是比较两个变量的正确方法。此外,它使用 eval() 方法评估 filterInput 变量作为 find() 方法内的条件,这样它将按预期工作。

    请记住,通常不鼓励使用 eval(),因为它可能存在安全风险并且速度也很慢。您应该使用更安全、更快速的方法来评估条件,但由于这是一个小示例并且过滤器输入是硬编码的,因此它是可以接受的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      • 1970-01-01
      相关资源
      最近更新 更多