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

Reduce with obj key, value not working as expected

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

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') 

我得到:

 UPDATE mytable SET 1 WHERE search_condition.

显然 insertValues 没有正常工作。我期待:

代码=1

但结果显示为“1”。我做错了什么?

.push returns 数组的新长度,而不是变异数组。虽然您可以将 .push 放在自己的行上,并将数组 return 放在下一行:

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')

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