- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这可能有点困难,因为除了标准运算符之外,我还没有看到任何人尝试过这一点。
我有一个包含大约 50k 行对象的表,每行需要针对它们运行一组“最多 30”个表达式并返回 true 或 false。我已经成功地与大量固定运营商完成了这项工作,但它很快就会变得困惑。
有人有更好的方法吗?下面的最小代码 - 问题出在验证函数中。
const objects = [
{
'First Name': 'Chris',
'Age': 18,
'Major': 'Mathematics',
'College Department': 'Mathematics'
},
{
'First Name': 'null',
'Age': 21,
'Major': 'Mathematics',
'College Department': 'Science'
}
]
const validate = (object, rule) => {
// logic to convert rule to logical expression
}
const results = objects.map(object => {
var flags = []
flags.push(validate(object, '[Fist Name] is null'))
flags.push(validate(object, '[Age] < [Required Age]'))
flags.push(validate(object, '[Major] === [College Department] and [Age] > [Required Age]'))
// Validate is supposed to return
// {Rule: '[Fist Name] is null', Flag: false/true, ...Rest of original object and key pairs}
// ... Return array of flags
return flags;
})
// Result should look like this
// lets say required age is 18
[
[
{Rule: '[Fist Name] is null', Flag: false, 'First Name': 'Chris', 'Age': 18, 'Major': 'Mathematics', 'College Department': 'Mathematics'},
{Rule: '[Age] < [Required Age]', Flag: false, 'First Name': 'Chris', 'Age': 18, 'Major': 'Mathematics', 'College Department': 'Mathematics'},
{Rule: '[Major] === [College Department] and [Age] > [Required Age]', Flag: true, 'First Name': 'Chris', 'Age': 18, 'Major': 'Mathematics', 'College Department': 'Mathematics'}
],
[
{Rule: '[Fist Name] is null', Flag: true, 'First Name': 'null', 'Age': 21, 'Major': 'Mathematics', 'College Department': 'Science'},
{Rule: '[Age] < [Required Age]', Flag: false, 'First Name': 'null', 'Age': 21, 'Major': 'Mathematics', 'College Department': 'Science'},
{Rule: '[Major] === [College Department] and [Age] > [Required Age]', Flag: false, 'First Name': 'null', 'Age': 21, 'Major': 'Mathematics', 'College Department': 'Science'}
]
]
// I know how to concat the arrays into one,
// so either the above output works or the one below works
[
{Rule: '[Fist Name] is null', Flag: false, 'First Name': 'Chris', 'Age': 18, 'Major': 'Mathematics', 'College Department': 'Mathematics'},
{Rule: '[Age] < [Required Age]', Flag: false, 'First Name': 'Chris', 'Age': 18, 'Major': 'Mathematics', 'College Department': 'Mathematics'},
{Rule: '[Major] === [College Department] and [Age] > [Required Age]', Flag: true, 'First Name': 'Chris', 'Age': 18, 'Major': 'Mathematics', 'College Department': 'Mathematics'},
{Rule: '[Fist Name] is null', Flag: true, 'First Name': 'null', 'Age': 21, 'Major': 'Mathematics', 'College Department': 'Science'},
{Rule: '[Age] < [Required Age]', Flag: false, 'First Name': 'null', 'Age': 21, 'Major': 'Mathematics', 'College Department': 'Science'},
{Rule: '[Major] === [College Department] and [Age] > [Required Age]', Flag: false, 'First Name': 'null', 'Age': 21, 'Major': 'Mathematics', 'College Department': 'Science'}
]
更新 这是我已经走了多远,但只能对 >、<=、> 执行此操作,或者至少这就是我迄今为止测试过的所有内容。我将很快添加更多详细说明的评论。
const object = {Age: 10, Required: 18};
const rules = [
{R: '["Age"] < ["Required"]', O: ['<']},
{R: '["Age"] <= ["Required"]', O: ['<=']},
{R: '["Age"] > ["Required"]', O: ['>']},
]
// Prototype that will parse the string
// ... then return the indexes of char
// ... we will use this to insert object name before the char
String.prototype.toIndices = function (d) { return this.split("").reduce((a, e, i) => e === d ? a.concat(i) : a, []) };
String.prototype.splice = function(idx, rem, str) {
return this.slice(0, idx) + str + this.slice(idx + Math.abs(rem));
};
Object.prototype.validateRule = function (r) {
const newString = r['R'].toIndices("[").map(s => {
return r['R'].splice(s, 0, 'object');
})
var exp = [];
for (let item = 0; item < newString.length; item++) {
for (let obj = 0; obj < newString[item].split(" ").length; obj++) {
if (newString[item].split(" ")[obj].includes("object"))
exp.push(newString[item].split(" ")[obj])
}
}
return [...exp].map((e, i) => i < exp.length - 1 ? [e, r['O'][0]] : [e]).reduce((a, b) => a.concat(b)).join(" ");
}
console.log({Rule: rules[0]['R'], Flag: eval(object.validateRule(rules[0]))});
// output
/*
{ Rule: '["Age"] < ["Required"]', Flag: true }
*/
console.log(rules.map(rule => { return {Rule: rule['R'], Flag: eval(object.validateRule(rule))} }));
// output
/*
[ { Rule: '["Age"] < ["Required"]', Flag: true },
{ Rule: '["Age"] <= ["Required"]', Flag: true },
{ Rule: '["Age"] > ["Required"]', Flag: false } ]
*/
最佳答案
如果您需要计算的表达式提前已知,请用代码写出表达式。
const rules = new Map()
rules.set("[First Name] is null", function(object) {
return object.firstName === null
})
创建自己的迷你语言需要大量工作。如果您需要让用户添加自定义规则,那么构建规则解析器和评估引擎是有意义的。
<小时/>在解析代码中,计算表达式的方法通常是将输入分解为标记,然后在第二步中计算标记。
function parse(textInput) {
return arrayOfTokens
}
文本输入示例:[拳头名称]为空
token 数组示例:[ new Field("First Name"), new OpIsNull() ]
为不同的文本输入编写大量单元测试,并确保它返回预期的标记。当解析正常工作时,下一步是评估标记。为标记、对象和预期输出值的数组编写大量单元测试。
function evaluate(object, tokens) {
let leftHand = null
if (tokens[0] instanceof Field) {
leftHand = getFieldValue(object, tokens[0])
}
if (tokens[1] instanceof OpIsNull) {
return leftHand === null
}
// etc
}
function getFieldValue(object, field) {
if (field.name == "First Name") {
return object.firstName
}
}
关于javascript - 将动态字符串转换为 JavaScript 中的逻辑表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56160045/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!