将for循环转换为"为每个"

时间:2014-03-27 03:50:39

标签: javascript for-loop foreach

已经坚持了一段时间: 我尝试将下面的代码转换为每个语句的,最后我发现了错误。

ChartClass.prototype.dataTranslatorLine = function(data) {
        jsonLength = Object.keys(data).length;
        for (j = 0; j < jsonLength; j += 2) {
            var innerObjArray = new Array();
            positionNumber = Object.keys(data[j].position).length;
            for (k = 0; k < positionNumber; k++) {
                var obj = {};
                obj.x = data[j].position[k];
                obj.y = data[j + 1].position[k];
                innerObjArray.push(obj);
            }
            dataArray.push(innerObjArray);
        }
        return dataArray;
    };

任何人都可以帮我解决这个问题吗?

查看我的小提琴here

1 个答案:

答案 0 :(得分:1)

我不完全确定发生了什么,但这应该是使用forEach的非常直接的翻译。

ChartClass.prototype.dataTranslatorLine = function(data) {
    var dataArray = [];
    Object.keys(data).forEach(function(key, idx) {
        if (idx % 2 === 1) {
            return;
        }

        var innerObjArray = [];
        Object.keys(data[idx].position).forEach(function(key2, idx2) {
            var obj = {
                x: data[idx].position[idx2],
                y: data[idx + 1].position[idx2]
            };
            innerObjArray.push(obj);
        });

        dataArray.push(innerObjArray);
    });

    return dataArray;
};

但有几点注意事项:如果数据是数组,则无需在其上调用Object.keys,只需直接进行迭代即可;这段代码相当令人费解,我认为通过传递数据结构的一些工作可能更有意义;并且for循环可能更适合您的情况,而不是forEach循环,因为您主要处理索引而不是使用值进行处理。

编辑:

在查看您的数据结构后,这是一种快速而肮脏的方法,但我仍然建议您重新设计如何将数据存储到更有意义的内容中。

ChartClass.prototype.dataTranslatorLine = function(data) {
    for (var i = 0; i < data.length; i += 2) {
        x = data[i].position;
        y = data[i + 1].position;

        var innerObj = [];
        for (var j = 0; j < x.length; j++) {
            innerObjArray.push({
                x: x[j],
                y: y[j]
            });
        }

        dataArray.push(innerObj);
    }

    return dataArray;
};

由于您使用索引而不仅仅是数组的内容,forEach并不会为您买任何东西。至于keyObject.keys(data).forEach(function(key, idx) {对你来说是什么,它将成为字符串&#39; name&#39;和&#39;位置&#39;因为你正在迭代对象的键。此外,if (idx % 2 === 1) { return; }是它如何模仿原始for循环中的j += 2,如果它是一个奇数索引,基本上退出该函数。