我正在尝试创建一个高级搜索函数,用于产品对象的多维数组。在表单上,用户可以选择根据几个不同属性的数据缩小产品结果范围(例如“'价格' < 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/