收藏
回答

wxs 中不支持 for in 循环

框架类型 问题类型 终端类型 微信版本 基础库版本
小程序 需求 客户端 6.5.3 2.3.1

- 需求的场景描述(希望解决的问题)

    wxs 中不支持 for in 循环,造成两点问题:

  1. 如何遍历对象

  2. 以前的 js 代码无法复用(虽然官方不允许 js 和 wxs 互通,但还是可以通过构建工具同构)



- 希望提供的能力


支持 for in 循环遍历对象的能力

回答关注问题邀请回答
收藏

11 个回答

  • 晨
    2018-11-14

    反馈收到,已经推给相关同事评估。

    2018-11-14
    有用
    回复 32
    • 陈式坚
      陈式坚
      2019-12-10
      一年过去了 现在情况怎么样
      2019-12-10
      2
      回复
    • 野
      2020-03-01
      两年过去了 现在情况怎么样
      2020-03-01
      2
      回复
    • 郭不帅
      郭不帅
      2020-05-22
      两年半过去了 现在情况怎么样
      2020-05-22
      1
      回复
    • 杨前程
      杨前程
      2020-06-24
      两年七个月过去了  现在情况怎么样
      2020-06-24
      回复
    • everglow
      everglow
      2020-07-31
      两年八个月过去了,现在情况怎么样
      2020-07-31
      回复
    查看更多(27)
  • 海冰
    海冰
    2021-09-01

    弱弱的问一句:2022年春节前,能不能搞定?

    2021-09-01
    有用 1
    回复
  • Finch Yang
    Finch Yang
    2021-05-26

    2021年了还是不行

    2021-05-26
    有用 1
    回复
  • 🙄国民王九蛋🤒
    🙄国民王九蛋🤒
    2018-11-29

    ES6以上语法不支持也就算了,for in 这么基础的遍历方法都还没支持,心情凉凉~

    2018-11-29
    有用 1
    回复
  • null
    null
    04-18

    五年半过去了,依然不支持。。。

    04-18
    有用
    回复
  • 银色子弹
    银色子弹
    2023-12-19

    可以在wxs中使用polyfill,具体实现如下:

    function forEachObj(obj, callback) {
      var json = JSON.stringify(obj)
        .replace(getRegExp('\n', 'g'), '')
        .replace(getRegExp('^\{'), '')
        .replace(getRegExp('\}$'), '')
        .trim();
      if (typeof callback !== 'function' || json === '') return;
      var specialExp = getRegExp('\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})', 'g');
      var contExp = getRegExp('"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?', 'g');
      var dangerousExp = getRegExp('[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]', 'g');
      dangerousExp.lastIndex = 0;
      var commaExp = getRegExp('\,', 'g');
      var bklExp = getRegExp('\[', 'g');
      var bkrExp = getRegExp('\]', 'g');
      var bslExp = getRegExp('\{', 'g');
      var bsrExp = getRegExp('\}', 'g');
      if (dangerousExp.test(json)) {
        json = json.replace(dangerousExp, function(str) {
          return '\\u' + ('0000' + str.charCodeAt(0).toString(16)).slice(-4);
        });
      }
      var specialFlags = json.match(specialExp) || [];
      var dedupFlags = [];
      for (var sp = 0; sp < specialFlags.length; sp++) {
        var item = specialFlags[sp];
        if (dedupFlags.indexOf(item) === -1) {
          dedupFlags.push(item);
        }
      }
      dedupFlags.sort(function(a,b) {
        var perv = a.split('').filter(function(f) { return '\\' === f }).length;
        var next = b.split('').filter(function(f) { return '\\' === f }).length;
        return next - perv;
      });
      var rmSize = 7;
      var ltSize = rmSize + dedupFlags.length;
      var letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
      var randomList = [];
      for (var l = 0; l < ltSize; l++) {
        var flag = true;
        while(flag) {
          var strList = [];
          while(strList.length < 5) {
            var idx = Math.floor(Math.random() * letters.length);
            if (strList.indexOf(letters[idx]) === -1) {
              strList.push(letters[idx]);
            }
          }
          var joinStr = '@' + strList.join('') + '@';
          if (randomList.indexOf(joinStr) === -1 && json.indexOf(joinStr) === -1) {
            randomList.push(joinStr);
            flag = false;
          }
        }
      }
      var replaceMap = {
        comma: randomList[0],
        bkl: randomList[1],
        bkr: randomList[2],
        bsl: randomList[3],
        bsr: randomList[4],
        contSplit: randomList[5],
        split: randomList[6]
      };
      var specialRandoms = randomList.slice(rmSize, ltSize);
      var eqFlag = '\\'.charAt(0);
      for (var dpf = 0; dpf < dedupFlags.length; dpf++) {
        var item = dedupFlags[dpf];
        var targetItem = item.split('').map(function(m) {
          var isSpecFlag = m.charAt(0) === eqFlag;
          if (isSpecFlag) {
            m = eqFlag + m;
          }
          return m;
        }).join('');
        json = json.replace(getRegExp(targetItem, 'g'), specialRandoms[dpf]);
      }
      var jsonConts = json.match(contExp) || [];
      var jsonFlags = json.replace(contExp, replaceMap.contSplit).split(replaceMap.contSplit);
      var joinJson = '';
      for (var j = 0; j < jsonConts.length; j++) {
        var item = jsonConts[j];
        if (commaExp.test(item) || bklExp.test(item) || bkrExp.test(item) || bslExp.test(item) || bsrExp.test(item)) {
          item = item
            .replace(getRegExp('\,$'), '')
            .replace(commaExp, replaceMap.comma)
            .replace(bklExp, replaceMap.bkl)
            .replace(bkrExp, replaceMap.bkr)
            .replace(bslExp, replaceMap.bsl)
            .replace(bsrExp, replaceMap.bsr);
        }
        joinJson += (jsonFlags[0] || '') + item;
        jsonFlags.shift();
      }
      json = joinJson + (jsonFlags[0] || '');
      var jsonList = json.replace(getRegExp('\,', 'g'), ',' + replaceMap.split).split(replaceMap.split);
      var count = 0;
      var jsonStr = '';
      for (var i = 0; i < jsonList.length; i++) {
        var item = jsonList[i];
        if (getRegExp('\[|\{|\]|\}').test(item)) {
          var start = item.match(getRegExp('\[|\{', 'g')) || [];
          var end = item.match(getRegExp('\]|\}', 'g')) || [];
          var diff = start.length - end.length;
          count += diff;
          jsonStr += item;
        } else if (count > 0) {
          jsonStr += item;
        } else if (count === 0 && jsonStr === '') {
          jsonStr = item;
        }
        if (count === 0) {
          jsonStr = jsonStr
            .replace(getRegExp(replaceMap.comma, 'g'), ',')
            .replace(getRegExp(replaceMap.bkl, 'g'), '[')
            .replace(getRegExp(replaceMap.bkr, 'g'), ']')
            .replace(getRegExp(replaceMap.bsl, 'g'), '{')
            .replace(getRegExp(replaceMap.bsr, 'g'), '}');
          var keyStr = (jsonStr.match(getRegExp('"[^"\\\n\r]*"')) || [])[0] || '';
          var valueStr = jsonStr.replace(keyStr, '').replace(getRegExp('^:'),'').replace(getRegExp('\,$'), '') || '';
          for (var sr = 0; sr < specialRandoms.length; sr++) {
            var item = specialRandoms[sr];
            keyStr = keyStr.replace(getRegExp(item, 'g'), dedupFlags[sr]);
            valueStr = valueStr.replace(getRegExp(item, 'g'), dedupFlags[sr]);
          }
          var kv = JSON.parse('['+keyStr+','+valueStr+']');
          callback(kv[0], kv[1]);
          jsonStr = '';
        }
      }
    }
    

    相关链接:

    CSDN: https://blog.csdn.net/Avril_L/article/details/134882886

    github:https://github.com/chenwei1012/for-each-object/tree/release-v1.0.0

    gitee:https://gitee.com/chenwei1012/for-each-object/tree/master

    2023-12-19
    有用
    回复
  • 曾冲
    曾冲
    2022-10-05

    只能使用[ [key,value],[key,value] ]形式的类型了,使用Object.entries({name:'jack'})转化。

    2022-10-05
    有用
    回复 1
    • 曾冲
      曾冲
      2022-10-05
      或者把对象转成字符串解析成这种形式
      2022-10-05
      回复
  • 大象无形
    大象无形
    2022-01-04

    2022年了,现在情况怎么样了

    2022-01-04
    有用
    回复
  • 加伊
    加伊
    2021-12-23

    马上2022年元旦了,请问好了吗

    2021-12-23
    有用
    回复
  • 黎😄
    黎😄
    2019-01-21

    for in不能用,用

    for(var i =0; i<arr.length; i++){


    }


    2019-01-21
    有用
    回复 2
    • 郭珍珍
      郭珍珍
      2019-08-16
      大哥 是循环对象 不是循环数组 明显这样不行啊
      2019-08-16
      1
      回复
    • so?
      so?
      2023-06-06
      循环数组也报错了。。。。
      2023-06-06
      回复

正在加载...

登录 后发表内容