使用 obj 键减少,值未按预期工作

时间:2021-01-10 01:38:03

标签: javascript node.js sqlite reduce

我正在尝试使用 node.js 动态创建一个 sqlite 插入字符串。我有:

while True:
    My Code
    time.sleep(43200)

当我运行它时:

function update_json_obj_into_table(tablename, obj, search_condition) {

  const insertValues = Object.entries(obj).reduce((acc, [k,v]) => acc.push(`${k} = ${v}`), []);

  const insertValuesString = Array.prototype.join.call(insertValues, '/');

 console.log(insertValuesString);
 console.log(`UPDATE ${tablename} SET ${insertValues} WHERE ${search_condition}`);
 // db.run(`UPDATE ${tablename} SET ${insertValuesString} WHERE search_condition ;`);
};

我明白了:

 const obj = {Code: 'A1'};
 update_json_obj_into_table('mytable', obj, 'search_condition') 

显然,insertValues 工作不正常。我期待:

代码 = 1

但它以 '1' 的形式出现。我做错了什么?

1 个答案:

答案 0 :(得分:1)

.push 返回数组的新长度,而不是变异后的数组。虽然您可以将 .push 放在单独的行上并在下一行返回数组:

function update_json_obj_into_table(tablename, obj, search_condition) {

  const insertValues = Object.entries(obj).reduce((acc, [k, v]) => {
    acc.push(`${k} = ${v}`);
    return acc;
  }, []);

  const insertValuesString = Array.prototype.join.call(insertValues, '/');

  console.log(insertValuesString);
  console.log(`UPDATE ${tablename} SET ${insertValues} WHERE ${search_condition}`);
  // db.run(`UPDATE ${tablename} SET ${insertValuesString} WHERE search_condition ;`);
};


const obj = {
  Code: 'A1'
};
update_json_obj_into_table('mytable', obj, 'search_condition')

使用 .map 会更有意义,因为输入数组和输出 insertValues 数组是一对一的:

function update_json_obj_into_table(tablename, obj, search_condition) {

  const insertValues = Object.entries(obj)
    .map(([k, v]) => `${k} = ${v}`);

  const insertValuesString = Array.prototype.join.call(insertValues, '/');

  console.log(insertValuesString);
  console.log(`UPDATE ${tablename} SET ${insertValues} WHERE ${search_condition}`);
  // db.run(`UPDATE ${tablename} SET ${insertValuesString} WHERE search_condition ;`);
};


const obj = {
  Code: 'A1'
};
update_json_obj_into_table('mytable', obj, 'search_condition')

也就是说,像这样动态构造的查询很少是一个好主意 - 除非输入值得信赖,否则它可能会危及您的数据库。即使输入是值得信赖的,由于分隔符转义问题、保留作品等,它也可能不优雅。最好查找一下如何使用准备好的语句,以便数据库驱动程序处理外部值的插值。