已经坚持了一段时间: 我尝试将下面的代码转换为每个语句的,最后我发现了错误。
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
答案 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
并不会为您买任何东西。至于key
中Object.keys(data).forEach(function(key, idx) {
对你来说是什么,它将成为字符串&#39; name&#39;和&#39;位置&#39;因为你正在迭代对象的键。此外,if (idx % 2 === 1) { return; }
是它如何模仿原始for循环中的j += 2
,如果它是一个奇数索引,基本上退出该函数。