关于数组和字符串遍历的问题

//这是从自定义sql中获取的
var sql=[
        "insert into 产品lr(产品id,产品名称) values('",
        ["94"], //数组的长度不确定
        "','",
        ["DDDfffDDD","DDD盐DDD","DDD海鲜粉DDD","DDD胡椒粉DDD","DDD333DDD"], 数组的长度不确定
        "','",
        "",
        "''\n\n)"
    ]
//最后要得到:(循环插入使用)
[
   "insert into 产品lr(产品id,产品名称) values('94','DDDfffDDD')",  
    "insert into 产品lr(产品id,产品名称) values('94','DDD盐DDD')",  
    "insert into 产品lr(产品id,产品名称) values('94','DDD海鲜粉DDD') ",  
    "insert into 产品lr(产品id,产品名称) values('94','DDD胡椒粉DDD')",   
    "insert into 产品lr(产品id,产品名称) values('94','DDD333DDD')"  
] 

这个该怎么实现?

阅读 2.2k
3 个回答
// 先把 sql 中所有数组找出来(记录他们的索引号)
const indexes = sql
    .map((t, i) => Array.isArray(t) ? i : -1)
    .filter(i => i >= 0);

// 由于 sql 中是数组的元素个数不定(示例中是2个,实际不定)
// 所以循环层次不能确定,采用递归的方式来完成遍历,
// make 是个递归函数,每次递归到最后会产生一条结果语句,存入 result 数组中,
// temp 是一个临时数组,跟 sql 一样,只不过在 sql 中数组的位置保存的其中一个值,
// index 表示处理到 indexes 中的哪一个索引了,其在 sql 中的索引是 indexes[index]
function make(result, temp, index) {
    // 结束条件,完成对 indexes 的遍历,即 index 超出 indexes 的有效范围
    if (index >= indexes.length) {
        // 此时 temp 中每一个原来是数组的位置都保存着一个选出来值,
        // 直接通过 join 生成 SQL 语句即可
        result.push(temp.join(""));
        // 别忘了中止函数
        return;
    }

    const sqlIndex = indexes[index];
    // sql[sqlIndex] 是一组值,遍历这组值,每次填入 temp 之后进行下一层次的 make 调用,
    // 即递归调用
    sql[sqlIndex]
        .forEach(v => {
            temp[sqlIndex] = `${v}`;
            make(result, temp, index + 1);
        });
}

const result = [];
// 用 [].concat(sql) 从 sql 复制一个结构相同的数组,
// 对其元素的改变不会影响到 sql(sql 作为原始数组需要保持不变)
make(result, [].concat(sql), 0);

console.log(JSON.stringify(result, null, 4));

在第一个数组中加了 83 之后的运行结果,跟你需要的结果略有不同,那是因为模板本身的问题

[
    "insert into 产品lr(产品id,产品名称) values('94','DDDfffDDD','''\n\n)",
    "insert into 产品lr(产品id,产品名称) values('94','DDD盐DDD','''\n\n)",
    "insert into 产品lr(产品id,产品名称) values('94','DDD海鲜粉DDD','''\n\n)",
    "insert into 产品lr(产品id,产品名称) values('94','DDD胡椒粉DDD','''\n\n)",
    "insert into 产品lr(产品id,产品名称) values('94','DDD333DDD','''\n\n)",
    "insert into 产品lr(产品id,产品名称) values('83','DDDfffDDD','''\n\n)",
    "insert into 产品lr(产品id,产品名称) values('83','DDD盐DDD','''\n\n)",
    "insert into 产品lr(产品id,产品名称) values('83','DDD海鲜粉DDD','''\n\n)",
    "insert into 产品lr(产品id,产品名称) values('83','DDD胡椒粉DDD','''\n\n)",
    "insert into 产品lr(产品id,产品名称) values('83','DDD333DDD','''\n\n)"
]
新手上路,请多包涵
insert into 产品lr(产品id,产品名称,供应商名称,型号) values('94',['DDDfffDDD','DDD盐DDD','DDD海鲜粉DDD','DDD胡椒粉DDD','DDD333DDD'],['fff','盐','海鲜粉','胡椒粉','333'],'DDDfffDDD,DDD盐DDD,DDD海鲜粉DDD,DDD胡椒粉DDD,DDD333DDD')

存成这样,然后找到数组,双层for循环即可。

let res1 = []
sql[1].forEach(value => {
    sql[3].forEach(value1 => {
        let item1 = `${sql[0]}${value}','${value1}'),`;
        res1.push(item1)
    });
})
console.log(res1)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题