Това е първата от поредица публикации, в които сравнявам ES5 с ES6+.

Примерът, който ще дам днес, ще използва стрелката Filter, forEach, Const, Fat и метода Object.keys, за да върне масив от уникални числа от даден масив.

// ES5 Syntax
const arr = [3,2,3,6,4,1,2,3,2,1,2,3];
function findUniqNumber(arr) {
 var uniqObj = {};
 var uniqNumber = [];
 for (var i = 0; i < arr.length; i++) {
    if (!uniqObj.hasOwnProperty(arr[i])) {
      uniqObj[arr[i]] = 1;
    } else { 
      uniqObj[arr[i]] ++; 
    }
  }
  for (var key in uniqObj) {
    if (uniqObj[key] == 1) uniqNumber.push(parseFloat(key));
  }
  return uniqNumber;
}
findUniqNumber(arr);

Тук имам типичен for цикъл. Вътре в цикъла проверявам дали обектът има свойството, предадено към него, след което или добавяме свойството към обекта със стойност 1, или увеличаваме стойността на текущото свойство.

След това използвам цикъла for in, за да обходя изброимите свойства на обекта, за да видя дали стойността на текущия ключ е равна на 1. Ако е, анализирам Float ключа, за да го преобразувам обратно в число (поведение по подразбиране, ключовете на javascript обект винаги са низ.). Последно връщам масива от уникални числа.

Ето същата функция в синтаксиса на ES6 (помислих):

// ES6 syntax
const arr = [3,2,3,6,4,1,2,3,2,1,2,3];
const findUniqNumber = (array) => {
  const obj = {};
  const uniqNumber = [];  
  array.forEach(a => {
    if (!obj.hasOwnProperty(a)) {
      obj[a] = 1;
    } else {
      obj[a] ++;
    }
  });
  return Object.keys(obj).filter(k => obj[k] === 1);
}
findUniqNumber(arr);

Наистина по-просто. По-малко променливи и по-точно по същество според мен. Цикълът foreach се грижи за цикъла без необходимост от допълнителни променливи и брояч. Object.keys ми дава масив, състоящ се от ключовете на обекта, който създадох, който след това мога да повторя с филтърния метод. Филтърният метод ще върне нов масив само от ключовете, които отговарят на даденото му условие.

Има обаче малък проблем. Ако стартирате функцията, ще забележите, че масивът връща числа на низове спрямо действителни числа. Както казах по-горе, поведението на javascript обект по подразбиране е, че ключовете ще бъдат низове, без значение. Ако типът има значение, а в този случай има значение, единственото решение, което успях да намеря, е цикълът for in от примера на ES5.

const arr = [3,2,3,6,4,1,2,3,2,1,2,3];
const findUniqNumber = (array) => {
  const obj = {};
  const uniqNumber = [];  
  array.forEach(a => {
    if (!obj.hasOwnProperty(a)) {
      obj[a] = 1;
    } else {
      obj[a] ++;
    }
  });
  for (let key in obj) {
    if (obj[key] == 1) uniqNumber.push(parseFloat(key));
  }
  return uniqNumber;
}
findUniqNumber(arr);

Това е всичко за днес. Благодаря за четенето!