我有一个我在ES6中迭代的设置。我试图将它转换为ES5中的等价物。由于ES6,我的构建失败了。这就是我将它转换为ES5的原因。
这是我在ES6中的代码
service.getDevices = function (date) {
var result = [];
var deviceList = devices[date.getTime()];
for (let item of deviceList) { // browser compatibility: support for ECMA6
result.push({"deviceName": item});
}
return result;
}
由于'let',我收到了错误。我尝试使用for (var item in deviceList)
,但它不会显示图表。
我也试过这个:
for(var i = 0; i < deviceList.length(); i++){
result.push({"deviceName" : deviceList[i]});
}
即使这不适用于套装。谁可以帮助并告诉我如何迭代ES5中的一个集合,如果这是不可能的,是否有任何等效的方法呢?
答案 0 :(得分:6)
为什么不迭代数据并使用Array#map
映射结果。
result = deviceList.map(function (item) {
return { deviceName: item };
});
答案 1 :(得分:4)
这是我多年来使用变体的基本集合es5类。
function Set(items) {
this._data = {};
this.addItems(items);
}
Set.prototype.addItem = function(value) {
this._data[value] = true;
return this;
}
Set.prototype.removeItem = function(value) {
delete this._data[value];
return this;
}
Set.prototype.addItems = function(values) {
for (var i = 0; i < values.length; i++) {
this.addItem(values[i]);
}
return this;
}
Set.prototype.removeItems = function(values) {
for (var i = 0; i < values.length; i++) {
this.removeItem(values[i]);
}
return this;
}
Set.prototype.contains = function(value) {
return !!this._data[value];
}
Set.prototype.reset = function() {
this._data = {};
return this;
}
Set.prototype.data = function() {
return Object.keys(this._data);
}
Set.prototype.each = function(callback) {
var data = this.data();
for (var i = 0; i < data.length; i++) {
callback(data[i]);
}
}
var set = new Set(['a', 'b', 'c']);
console.log(set.addItems(['a', 'd', 'e']).removeItems(['b', 'e']).data());
console.log(set.contains('a'));
console.log(set.contains('e'));
set.each(console.log)
&#13;
答案 2 :(得分:2)
我认为您的第二个for
示例的问题只是length
是属性而不是函数,因此您不应将()
添加到其末尾。这个的工作版本可能如下所示:
for(var i = 0; i < deviceList.length; i++){
result.push({"deviceName" : deviceList[i]});
}
这假定(@grabantot指出)deviceList
是一个数组,但是,如果它是Set
,则需要使用deviceList.size
属性。
但是,您的第一个for
循环的兼容版本是forEach()
函数(可在Array和Set上使用),如下所示:
deviceList.forEach(function (item) {
result.push({"deviceName": item});
});