javascript - 我该怎么做才能在 Javascript 中拥有可序列化谓词?

标签 javascript serialization

我遇到了需要存储、检索和处理的情况 关于数据上下文(对象)的用户定义条件,确定 上下文在未来某个时刻是否满足用户的标准。

LogicJS对于我的需要来说似乎有点复杂,而且也不能清楚地解决我存储和检索条件的需要。

所以?:How can I serialize a function in JavaScript? (tldr; function.toString() 和 eval()) 似乎可以工作,但它看起来也像是一个严重的安全漏洞。

是否存在通用解决方案?

最佳答案

我使用的解决方案是@vlaz 和@AlbertJamesTeddy 所建议的。我找不到现有的通用解决方案。

截至2016年9月12日:

_.mixin({
  evaluatePredicateDescriptor: function (context, descriptor) {
    // A predicate descriptor must be an object with a valid 'op' String property, an appropriate 'arg' property value, and can optionally have a 'path' property.
    // e.g.
    // var egContext = [ [1, 2, 3], [2, 4, 6], [3, 6, 9, 12, 15] ];
    // var egDescriptor = { op: 'any', arg: { path: 'length', op: 'gt', arg: 6 } };
    // var result = _.evaluatePredicateDescriptor(egContext, egDescriptor); // false
    // egDescriptor = { op: 'any', arg: { op: 'any', arg: { op: 'equals', arg: 15 } } };
    // result = _.evaluatePredicateDescriptor(egContext, egDescriptor); // true
    if (this.descriptor === 'true' || this.descriptor === true) { return true; }
    if (this.descriptor === 'false' || this.descriptor === false) { return false; }
    if (!_.isEmpty(descriptor.path)) {
      context = _.get(context, descriptor.path)
    }
    switch (descriptor.op) {
      case 'true':
        return true;
        break;
      case 'false':
        return false;
        break;
      case 'and':
        return _.every(descriptor.arg, function (childDescriptor) {
          return _.evaluatePredicateDescriptor(context, childDescriptor);
        });
        break;
      case 'or':
        return _.some(descriptor.arg, function (childDescriptor) {
          return _.evaluatePredicateDescriptor(context, childDescriptor);
        });
      case 'not':
        return !_.evaluatePredicateDescriptor(context, descriptor.arg);
        break;
      case 'all':
        return _.every(context, function (contextArrayElement) {
          return _.evaluatePredicateDescriptor(contextArrayElement, descriptor.arg);
        });
        break;
      case 'any':
        return _.some(context, function (contextArrayElement) {
          return _.evaluatePredicateDescriptor(contextArrayElement, descriptor.arg);
        });
        break;
      case 'every':
        return _.every(context, descriptor.arg);
        break;
      case 'some':
        return _.some(context, descriptor.arg);
        break;
      case 'lt':
        return _.lt(context, descriptor.arg);
        break;
      case 'lte':
        return _.lte(context, descriptor.arg);
        break;
      case 'equals':
        return _.isEqual(context, descriptor.arg);
        break;
      case 'gte':
        return _.gte(context, descriptor.arg);
        break;
      case 'gt':
        return _.gt(context, descriptor.arg);
        break;
      case 'matches':
        return _.isMatch(context, descriptor.arg);
        break;
      case 'regex':
        var i = descriptor.arg.lastIndexOf('/');
        var pattern = descriptor.arg.substring(1, i);
        var flags = descriptor.arg.substring(i + 1);
        var regex = new RegExp(pattern, flags);
        return regex.test(context);
        break;
      default:
        console.warn('_.evaluatePredicateDescriptor() processed a descriptor without a valid operation.');
        break;
    }
    return false;
  }
});

https://github.com/stvrbbns/my-extended-lodash/blob/master/my-extended-lodash.js

关于javascript - 我该怎么做才能在 Javascript 中拥有可序列化谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39429292/

相关文章:

javascript - 捕获 child_process spawnSync 或 execSync stdout

javascript - 更改静态 map 上事件元素的图钉颜色

javascript - 如何在 Visual Studio 中删除针对第三方代码的 TypeScript 警告?

c# ProtoBuf serializer 新类型

c# - ServiceStack.Text 可以将 JSON 反序列化为自定义泛型类型吗?

javascript - Algolia 使用 Javascript 显示数组值

javascript - 如何使用变量值将 List<object> 序列化为 JSON?

.net - 我可以在不注释类的情况下自定义Json.NET序列化吗?

c# - 将类设为可序列化的缺点

javascript - Plotly js和平行坐标图