Ожидаемый идентификатор, строка или число в операторе Edge on spread

#javascript

Вопрос:

У меня есть следующий код, который уменьшает массив на ключ и группирует по этому ключу. Он отлично работает в Chrome/Firefox.

В Edge, ибо const newNode = { ...curr }; я получаю ошибку Expected identifier, string or number

В IE, потому const newData = baseData.reduce((acc, curr) => { что я получаю простое Syntax error .

Мой вопрос в том, правильно ли я поступаю и/или как избавиться от этих ошибок в IE/Edge?

jsFiddle: https://jsfiddle.net/xua0or5h/

 const d = [
  {"teamID":1,"name":"WMH ED Medics","id":1,"username":"WHT\andrew.bones","lastLoggedIn":null,"archive":false,"forename":"andrew","surname":"bones","band":"Band 7","role":"Developer","competency":"Kicks","employeeNumber":"123"},
  {"teamID":2,"name":"WMH ED Nursing","id":1,"username":"WHT\andrew.bones","lastLoggedIn":null,"archive":false,"forename":"andrew","surname":"bones","band":"Band 7","role":"Developer","competency":"Kicks","employeeNumber":"123"},
  {"teamID":3,"name":"Sedation","id":1,"username":"WHT\andrew.bones","lastLoggedIn":null,"archive":false,"forename":"andrew","surname":"bones","band":"Band 7","role":"Developer","competency":"Kicks","employeeNumber":"123"},
  {"teamID":4,"name":"Safeguarding Level 3","id":1,"username":"WHT\andrew.bones","lastLoggedIn":null,"archive":false,"forename":"andrew","surname":"bones","band":"Band 7","role":"Developer","competency":"Kicks","employeeNumber":"123"},
  {"teamID":5,"name":"Safeguarding Level 2","id":1,"username":"WHT\andrew.bones","lastLoggedIn":null,"archive":false,"forename":"andrew","surname":"bones","band":"Band 7","role":"Developer","competency":"Kicks","employeeNumber":"123"},
  {"teamID":6,"name":"Major Incident","id":1,"username":"WHT\andrew.bones","lastLoggedIn":null,"archive":false,"forename":"andrew","surname":"bones","band":"Band 7","role":"Developer","competency":"Kicks","employeeNumber":"123"},
  {"teamID":4,"name":"Safeguarding Level 3","id":276,"username":"WHT\colin.davids","lastLoggedIn":null,"archive":false,"forename":"colin","surname":"davids","band":"Band 8","role":"Chap","competency":"Pie","employeeNumber":null},
  {"teamID":5,"name":"Safeguarding Level 2","id":276,"username":"WHT\colin.davids","lastLoggedIn":null,"archive":false,"forename":"colin","surname":"davids","band":"Band 8","role":"Chap","competency":"Pie","employeeNumber":null},
  {"teamID":6,"name":"Major Incident","id":276,"username":"WHT\colin.davids","lastLoggedIn":null,"archive":false,"forename":"colin","surname":"davids","band":"Band 8","role":"Chap","competency":"Pie","employeeNumber":null},
  {"teamID":2,"name":"WMH ED Nursing","id":277,"username":"WHT\edward.french","lastLoggedIn":null,"archive":false,"forename":"edward","surname":"french","band":"Band 9","role":"Lady","competency":"Pizza","employeeNumber":null},
  {"teamID":3,"name":"Sedation","id":277,"username":"WHT\edward.french","lastLoggedIn":null,"archive":false,"forename":"edward","surname":"french","band":"Band 9","role":"Lady","competency":"Pizza","employeeNumber":null},
  {"teamID":4,"name":"Safeguarding Level 3","id":277,"username":"WHT\edward.french","lastLoggedIn":null,"archive":false,"forename":"edward","surname":"french","band":"Band 9","role":"Lady","competency":"Pizza","employeeNumber":null},
  {"teamID":8,"name":"Digital Team","id":281,"username":"WHT\gail.johnson","lastLoggedIn":null,"archive":false,"forename":"stewart","surname":"Johnson","band":"Band 91","role":"Solutions Developer Manager","competency":"Ninja","employeeNumber":"23546329"},
  {"teamID":1,"name":"WMH ED Medics","id":283,"username":"WHT\debra.morris","lastLoggedIn":null,"archive":false,"forename":"debra","surname":"morris","band":"Band 7","role":"Senior Solutions Developer","competency":"LOL","employeeNumber":"23546205"},
  {"teamID":2,"name":"WMH ED Nursing","id":283,"username":"WHT\debra.morris","lastLoggedIn":null,"archive":false,"forename":"debra","surname":"morris","band":"Band 7","role":"Senior Solutions Developer","competency":"LOL","employeeNumber":"23546205"},
  {"teamID":3,"name":"Sedation","id":283,"username":"WHT\debra.morris","lastLoggedIn":null,"archive":false,"forename":"debra","surname":"morris","band":"Band 7","role":"Senior Solutions Developer","competency":"LOL","employeeNumber":"23546205"},
  {"teamID":4,"name":"Safeguarding Level 3","id":283,"username":"WHT\debra.morris","lastLoggedIn":null,"archive":false,"forename":"debra","surname":"morris","band":"Band 7","role":"Senior Solutions Developer","competency":"LOL","employeeNumber":"23546205"},
  {"teamID":5,"name":"Safeguarding Level 2","id":283,"username":"WHT\debra.morris","lastLoggedIn":null,"archive":false,"forename":"debra","surname":"morris","band":"Band 7","role":"Senior Solutions Developer","competency":"LOL","employeeNumber":"23546205"},
  {"teamID":6,"name":"Major Incident","id":283,"username":"WHT\debra.morris","lastLoggedIn":null,"archive":false,"forename":"debra","surname":"morris","band":"Band 7","role":"Senior Solutions Developer","competency":"LOL","employeeNumber":"23546205"}
];

function reduceJson(baseData,k) {
  const newData = baseData.reduce((acc, curr) => {
    const node = acc.find((item) => item.id === curr.id);
    if (node) {
      node[k].push(curr[k]);
    } else {
      const newNode = { ...curr };
      newNode[k] = [curr[k]];
      acc.push(newNode)
    }
    return acc;
  }, []);
  return newData;
}
console.log(reduceJson(d,"name"))
 

Обновить

Оператор спреда теперь отсортирован

 const newNode = {};
Object.assign(newNode, curr);
 

Комментарии:

1.Функции со стрелками не поддерживаются в IE. Распространение в объектных литералах не поддерживается в Edge

2. <Педантизм><Педантизм> ... — это не оператор. Операторы не могут делать то, что делают синтаксис spread и rest. </Педантизм>

3. Исправьте ваше исправление для распространения свойств: Будьте осторожны, этого Object.assign тоже нет в IE, хотя оно может быть заполнено.

Ответ №1:

IE и Edge-это очень разные вещи. Кроме того, если вы получаете эту ошибку с Edge, вы используете очень старую версию Edge.

IE не поддерживает практически ничего из ES2015 . Это означает, что он не поддерживает функции со стрелками (ES2015) или синтаксис распространения свойств (ES2018). Он имеет ограниченную и неполную поддержку let и const . Это оно.

Edge v44 («Устаревший Edge») и более ранние версии поддерживали некоторые из ES2015 , но IIRC не поддерживал синтаксис распространения свойств.

Edge v79 и более поздние версии (между v44 и v79 не было версий), он же Chromium Edge, основаны на хроме, что означает, что они имеют движок JavaScript V8 и поддерживают распространение свойств.

Если вам нужна поддержка IE, вам не нужно использовать функции ES2015 или использовать транспилер/компилятор, такой как Babel, для преобразования их в (примерно) синтаксис уровня ES5, чтобы IE мог запускать код.

Если вам нужно поддерживать устаревший Edge, это аналогичная задача, но вы можете использовать множество функций ES2015 (например, функции со стрелками). Просто не распространяется на свойства и некоторые другие функции из более поздних выпусков. Например, устаревший Edge может заменить этот разброс свойств на:

 const newNode = Object.assign({}, curr);
 

Однако IE не поддерживает Object.assign . (Но он может быть полифасованным.)