简体   繁体   中英

Equivalent of set in ES6 to ES5

I have a set over which I am iterating in ES6. I am trying to convert it to its equivalent in ES5. My build is getting failed because of ES6. That's why I am converting it to ES5.

Here's my code in 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;
    }

I am getting error because of 'let'. I tried using for (var item in deviceList) , it does not display the charts.

I also tried this:

for(var i = 0; i < deviceList.length(); i++){
           result.push({"deviceName" : deviceList[i]});
       }

Even this is not working for set. can someone help and tell me how to iterate over a set in ES5 and if that is not possible, is there any equivalent way of doing it?

Why not just iterate through the data and map the result with Array#map .

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

This is a basic set es5 class that I have used variations on over the years.

 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)

I think your problem with your second for example is just that length is a property and not a function so you shouldn't add () to the end of it. A working version of this might look like this:

for(var i = 0; i < deviceList.length; i++){
  result.push({"deviceName" : deviceList[i]});
}

This assumes (as @grabantot pointed out) that deviceList is an array, however, if it's a Set then you need to use the deviceList.size property.

However, there is a more compatible version of your first for loop which is the forEach() function (which is available on Array and Set ), like this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM