javascript - Javascript - 动态转换 js,包括数组
问题描述
我有一个这样的json:
var getBody = req.body;
console.log(getBody);
{"tags":[{"tag":"Peter"},{"tag":"Maria"}],"term":"Jack","type":"name"}
我想将其动态转换为:
[ '%Peter%', '%Peter%', '%Maria%', '%Maria%', '%Jack%', 'name' ]
...所以如果可用,我需要每个标签值两次。
目前我有这个脚本:
var input = req;
var sqlVal = Object
.entries(input.body)
.reduce(function(result, entry) {
const key = entry[0]
const value = entry[1]
if( key === 'term' ) {
result.push('%' + value + '%')
} else if( key === 'tags' ) {
if ( value.length > 1 ) {
for ( let i=0; i < value.length; i++ ){
result.push('%' + value[i] + '%')
}
} else {
result.push('%' + value + '%')
}
} else if( key === 'type' ) {
if ( value.includes(",") ) {
var array = value.split(",");
for ( let i=0; i < array.length; i++ ){
result.push(array[i])
}
} else {
result.push(value)
}
}
return result
}, [])
...但我得到:
console.log(sqlVal);
[ '%[object Object]%', '%[object Object]%', '%Jack%', 'name' ]
我怎样才能得到想要的结果?
期望的结果:
[ '%Peter%', '%Peter%', '%Maria%', '%Maria%', '%Jack%', 'name' ]
...我在 node.js mysql 查询中使用这个脚本
编辑:
在上述情况下,我需要它的 SQL 如下所示:
SELECT name, abc from table WHERE (name LIKE ? OR abc LIKE ?) AND (name LIKE ? OR abc LIKE ?) AND (name LIKE ? OR abc LIKE ?) ORDER BY name;
注意: (name LIKE ? OR abc LIKE ?) 也是动态构建的。
解决方案
Object.values(req.body)
.flatMap(x => {
switch (Object.prototype.toString.call(x)) {
case '[object String]': return `%${x}%`;
case '[object Array]': return x.map(y => `%${y.tag}%`);
}
});
应该给出期望的输出。请注意,这Array.prototype.flatMap
是相当新的,您可能需要 polyfill。
推荐阅读
- java - Selenium Grid:DevToolsActivePort 文件不存在(未知错误:Chrome 无法启动:异常退出)
- javascript - 我想从这个站点复制元素的响应行为,如何进行?
- pdo - 如何在 slim 4 中设置多个 PDO 数据库连接并在存储库中访问它们?
- nginx - oauth2-proxy 身份验证在 kubernetes 集群上调用缓慢,带有 nginx 入口的身份验证注释
- excel - 使用单元格值来控制表格的过滤器功能(不是数据透视表)
- sql - SQL Server 设置的小数点分隔符与操作系统不同
- ansible - 在 Molecule 中使用 testinfra 作为验证器时如何调试测试
- python - 将 x-apikeyInfoFunc 的返回值转发给操作
- sql - 过滤多列中的多个值的最高效方法?
- omnet++ - 如何在 OMNET++ 模拟器的结果文件 .sca 中添加要测量的新参数?