等效于ES6到ES5中的设置

时间:2017-10-24 17:29:54

标签: javascript ecmascript-6 ecmascript-5

我有一个我在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中的一个集合,如果这是不可能的,是否有任何等效的方法呢?

3 个答案:

答案 0 :(得分:6)

为什么不迭代数据并使用Array#map映射结果。

result = deviceList.map(function (item) {
    return { deviceName: item };
});

答案 1 :(得分:4)

这是我多年来使用变体的基本集合es5类。

&#13;
&#13;
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;
&#13;
&#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()函数(可在ArraySet上使用),如下所示:

deviceList.forEach(function (item) {
  result.push({"deviceName": item});
});