js 三重循环push数据问题

如代码所示,前两次循环是循环出outdata的key和value,第三次循环是循环andDate,然后把outdata的key和andDate转换为拼音作比较,如果是相等的话,拼音作为key,outdata的value作为值。

但是输出出来的数据是

[{"CeShi":5,"ChaoJiCeShi":6,"WuDiCeShi":7,"ZhengChangCeShi":8}]

相当于只push了一次?
正确的数据应当是

[{"CeShi":1,"ChaoJiCeShi":2,"WuDiCeShi":3,"ZhengChangCeShi":4},{"CeShi":5,"ChaoJiCeShi":6,"WuDiCeShi":7,"ZhengChangCeShi":8}]

求助下各位神仙哥哥姐姐们我应该怎么做!!

var outdata = [{"测试":1,"超级测试":2,"无敌测试":3,"正常测试":4},{"测试":5,"超级测试":6,"无敌测试":7,"正常测试":8}]
var andDate = ["测试","超级测试","无敌测试","正常测试"]
var brr = [], obj = {}
for (var i = 0; i < outdata.length; i++) {
     for (var key in outdata[i]) {
         for(var ney in andDate){
             if(pinyin.getFullChars(key)===pinyin.getFullChars(andDate[ney])){   //pinyin.getFullChars(中文)这个方法就是将中文转拼音
               obj[pinyin.getFullChars(andDate[ney])] = outdata[i][key]

       }
    }
  }
}
brr.push(obj)

console.log('输出数据',JSON.stringify(brr));
//[{"CeShi":5,"ChaoJiCeShi":6,"WuDiCeShi":7,"ZhengChangCeShi":8}]
阅读 3.6k
3 个回答

brr.push(obj)移到第一个for循环中呢?

for (var i = 0; i < outdata.length; i++) {
    var obj = {}
    for (var key in outdata[i]) {
        for(var ney in andDate){
            if(pinyin.getFullChars(key)===pinyin.getFullChars(andDate[ney])){                   //pinyin.getFullChars(中文)这个方法就是将中文转拼音
                obj[pinyin.getFullChars(andDate[ney])] = outdata[i][key]
            }
        }
    }
    brr.push(obj)
}

写外面obj同一个引用覆盖了

var r1 = outdata.map(group => {
    const dict = Object.keys(group)
        .map(key => [pinyin.getFullChars(key), group[key]])
        .reduce((m, t) => {
            m[t[0]] = t[1];
            return m;
        }, {});

    return andDate.map(s => pinyin.getFullChars(s))
        .reduce((r, py) => {
            r[py] = dict[py];
            return r;
        }, {});
});
  1. 因为要对 outdata 的多组数据进行处理,所以肯定会输出多组数据,数量跟 outdata 的组数一致,所以用 outdata.map(group => {...}) 来做映射,一组输入对应一组输出
  2. 现在来看输出的东西是什么呢。从题主描述,输出是根据 andDate 来的,将 andDate 的每个元素,在 group(这是 outdata 的其中一组)中查找,找对对应值。所以 group 是个查找表
  3. 既然 group 是个查找表,可以用线性(遍历)查找,也可以做成字典,所以将其转换成 dict。因为 group 是一个对象,而不是数组,用线性查找需要先把 keys 取出来,所以干脆直接做成一个字典好了。
  4. 遍历 andDate,将每一个元素去 dict 里把值找出来,然后拼装成一个对象,一组结果就出来了
  5. 回到第 1 步,map() 会把 group => result 产生的多组结果再组合成一个数组,终结
不需要“采纳”,我只是多给个思路出来
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题