javascript - 如何在 javascript for 循环中从字符串创建 if 条件语句而不使用 eval()

标签 javascript arrays object dynamic eval

我正在尝试创建一个高级搜索函数,用于产品对象的多维数组。在表单上,​​用户可以选择根据几个不同属性的数据缩小产品结果范围(例如“'价格' < 20 && '国家' == '法国'”、“地区 == '纽约' && '年份' == '2016' && '数量 > 20")。变量 data 中的数据格式如下:

    0:
        name: "Kedem Cream Red Concord"
        appellation: "New York"
        country: "United States"
        price: "10.99"
        primarygrape: "Concord"
        qty: "1"

        region: "New York"
        regprice: "10.99"
        sku: "230"
        vintage: "NV"
    1:
        name: "Kendall Jackson Vintner's Chardonnay"

        appellation: ""

        country: "United States"

        price: "14.99"

        primarygrape: "Chardonnay"
        qty: "35"

        region: "California"

        regprice: "18.99"
        sku: "345"

        vintage: "2016"
... continuing on over 10,000 product records

我想我可以很容易地根据用户表单输入创建一个字符串,总结他们正在搜索的内容。但是,我需要一种安全的方法来评估函数中的字符串,该函数返回 resultsArray

中的过滤结果

我能够让它与eval()函数一起工作,但我知道这不安全或高效。我还尝试将条件放入数组中并尝试将其合并到 for 循环中,但我不知道如何使其工作。棘手的部分是,条件可以是涉及以下产品属性的任意数量的事物:名称、国家/地区、价格、主要葡萄、数量、地区、年份。不同的属性使用不同的运算符(例如国家、地区等使用“==”,而数量和价格使用“>”或“<”)。

这段代码可以工作,但是使用了禁忌的eval()函数:

var conditional = "data[i].price < 20 && data[i].country == 'France' && data[i].vintage == '2016'";

var resultArray = [];
console.log(data.length);
for (var i = 0; i < data.length; i++)
{
    if (eval(conditional))
        {
            resultArray.push(data[i]);
        }
    }
}

这不起作用,因为它会导致Uncaught ReferenceError:数据未定义错误:

var conditional = "return data[i].price < 20 && data[i].country == 'France' && data[i].vintage == '2016'";

var resultArray = [];
console.log(data.length);
for (var i = 0; i < data.length; i++)
{
    if (new Function(conditional)())
        {
            resultArray.push(data[i]);
        }
    }
}

知道如何动态创建 if 条件语句以便它识别 data 变量吗?或者有更好的解决方案吗?

最佳答案

Javascript 数组有一个名为 filter 的函数,它可以用来做你想要实现的事情。

例如,您有一个包含数字的数组:

var arr = [1,3,6,2,6]

您的计划是过滤所有偶数。您可以使用array.filter()。 你需要将一个匿名函数传递给它。在您有权访问当前元素的每个条目中,都会调用此函数一次。 您需要在此函数中返回一个 bool 值 - true 表示 该元素将位于新的过滤数组中

现在是过滤所有偶数的完整示例:

arr.filter(function(element) {return element%2 == 0})

我希望这足以让您继续下去。 :-) 在下一个片段中,我用您的数据数组做了一个小例子

 var your_data_array = [
 { 
       name: "Kendall Jackson Vintner's Chardonnay",
        appellation: "",
        country: "United States",
        price: "14.99",
        primarygrape: "Chardonnay",
        qty: "35",
        region: "California",
        regprice: "18.99",
        sku: "345",
        vintage: "2016" },
        { 
       name: "Kendall Jackson Vintner's Chardonnay",
        appellation: "",
        country: "United States",
        price: "14.99",
        primarygrape: "Chardonnay",
        qty: "35",
        region: "California",
        regprice: "18.99",
        sku: "345",
        vintage: "2016" },
        { 
       name: "Kendall Jackson Vintner's Chardonnay",
        appellation: "",
        country: "United States",
        price: "14.99",
        primarygrape: "Chardonnay",
        qty: "35",
        region: "California",
        regprice: "18.99",
        sku: "345",
        vintage: "2016" }
 ]
 
 var filtered_array = your_data_array.filter(function(dataElement) {
   return dataElement.country == "United States";
 })
 
 console.log(filtered_array)

关于javascript - 如何在 javascript for 循环中从字符串创建 if 条件语句而不使用 eval(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54638056/

相关文章:

javascript - Facebook Javascript SDK - 是否有一次回调函数 fb :likes have been loaded?

javascript - Jquery 汇总动态生成的表上的行数

php - 如何以所需的格式构造一个在 foreach() 循环内运行的数组?

mongodb - 来自 Collection 的 Meteor .find() 返回 [object Object]

javascript - 我的 JavaScript 代码中的索引越界错误

javascript - 单击按钮时从 UL 获取 id

javascript - 使用 $emit from 指令将事件发送到 Controller

javascript - 添加或更新数组元素

php - 此功能正在检查什么?

arrays - 在 typescript 中声明数组索引