Javascript:转换对象

时间:2019-03-05 08:45:16

标签: javascript node.js

我有一些看起来像这样的数据:

let wheredata = [ { "field": { "field": "email", "datatype": "STRING", "inputtype": "text", "model": "User" }, "operator": "Op.eq", "value": "myuser@gmail.com" }, { "field": { "field": "createdAt", "datatype": "DATE", "inputtype": "date", "model": "User" }, "operator": "Op.gt", "value": "2015-12-12" } ]

我实际上是在使用此数据构建一个动态的sequelize查询where子句,它应该如下图所示:

{
      email: {[Op.eq]: 'myuser@gmail.com'},
      createdAt: {[Op.gt]: '2015-12-12'}
    }

这是我执行此操作的代码:

let key, key1, obj, val;
wheredata.forEach(filter => {
  key = filter.field.field;

  key1 = filter.operator;
  if (filter.field.field.datatype === 'INTEGER') {
    val = parseInt(filter.value);
  } else {
    val = filter.value;
  }
  obj = {
    [key1]: val
  };

  whereuser[key] = obj;
});
console.log(whereuser);

但是我的答案如下:

{ 
  email: { 'Op.eq': 'myuser@gmail.com' },
  createdAt: { 'Op.gt': '2015-12-12' } 
}

通知操作员。它们实际上应该像[Op.eq]和[Op.gt],但在我的脚本中,它们分别是'Op.eq'和'Op.gt'。

我不了解如何以正确的格式获取这些运算符。

为进一步说明,我的正确执行的节点/序列化查询如下所示,其中User是序列化模型。如您所见,我正在尝试动态生成where子句。

User.findAll({
      where: {
        email: {[Op.eq]: 'myuser@gmail.com'},
        createdAt: {[Op.gt]: '2015-12-12'}
      }
    })

3 个答案:

答案 0 :(得分:5)

Op是现有对象(根据文档,Sequelize.Op),您需要将"Op.eq"字符串变成eq,因此可以使用方括号表示法制作一个表达式[Op[prop]],其结果为[Op.eq]

wheredata.forEach(filter => {
  const key = filter.field.field;
  const val = key.datatype === 'INTEGER'
    ? parseInt(filter.value)
    : filter.value;

  const { operator } = filter;
  const operatorProp = operator.split('.')[1];
  const obj = {
    [Op[operatorProp]]: val
  };

  whereuser[key] = obj;
});

答案 1 :(得分:1)

根据我的理解,您只想将它​​们包装在方括号中即可,您可以这样做:

obj = {
  [`[${key1}]`]: val
};

答案 2 :(得分:0)

您的运算符必须来自Sequelize模块,并且不能直接解释为字符串。

因此,在您的代码中使用的不是[key1],而是考虑到Op[key1.split('.')[1]]的{​​{1}}。


如果要使它更整洁,请创建一个使用运算符并返回要用作键的值的函数,进入Sequelize对象,如:

const Op = Sequelize.Op;


const Sequelize = {
  Op: {
    gt: 'gt',
  };
};

function (operator) {
  const split = operator.split('.');
  
  return split.reduce((tmp, x) => tmp[x], Sequelize);
}