首页 > 解决方案 > 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 ?) 也是动态构建的。

标签: javascriptarraysnode.js

解决方案


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。


推荐阅读