web-dev-qa-db-fra.com

Edge: SCRIPT1028: identifiant, chaîne ou numéro attendu

Ma page fonctionne correctement dans Chrome et Firefox: enter image description here

Cependant, lorsque j'essaie de charger cette page dans Edge, les questions et réponses disparaissent. Seules les catégories sont affichées. De plus, lorsque vous essayez de charger cette page dans IE, tout disparaît à l'exception de la barre de recherche.

Edge me donne l'erreur suivante:

SCRIPT1028: SCRIPT1028: Identificateur, chaîne ou numéro attendu à la ligne 84 du faq.html

Cela fait référence au code suivant:

function sortByCategory(data) {
  return data.reduce((obj, c) => {
    const { category, ...rest } = c; // this line throws the error
    obj[category] = obj[category] || [];
    obj[category].Push(rest);
    return obj;
  }, {});
}

Comment puis-je réparer ça?

6
Maurits Bouman

Il semble (de manière surprenante) qu'Edge ne prend pas encore en charge le repos de propriété, ce qui est regrettable, mais il n'a ensuite été officiellement ajouté que dans ES2018. Vous devrez réécrire le code pour ne pas utiliser le reste de propriété (le ...rest partie de votre objet littéral) (ou, comme CertainPerformance le suggère , utilisez un transpilateur).

Voici une de nombreuses façons de le faire:

function sortByCategory(data) {
    return data.reduce((obj, c) => {
        //const { category, ...rest } = c;
        const { category } = c;
        const rest = {};
        for (const key of Object.keys(c)) {
            if (key !== "category") {
                rest[key] = c[key];
            }
        }
        obj[category] = obj[category] || [];
        obj[category].Push(rest);
        return obj;
    }, {});
}

J'ai évité d'utiliser delete car delete sur un objet désoptimise l'objet, ce qui rend les recherches de propriété plus lentes. Mais la désoptimisation de ces objets peut ne pas changer la vitesse perçue de votre page/application, alors ...

8
T.J. Crowder

Ni Edge ni IE support syntaxe de repos de propriété d'objet (bien qu'Edge le supportera probablement éventuellement). Je suggère de transpiler automatiquement votre code vers ES5 avec Babel , qui vous permettra d'écrire dans la dernière et la meilleure version de la langue, tout en permettant aux navigateurs anciens et incompatibles de comprendre tout votre code transpilé. Par exemple, en vous connectant

const { category, ...rest } = c;

résulte en

"use strict";

function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }

var _c = c,
    category = _c.category,
    rest = _objectWithoutProperties(_c, ["category"]);

Ça n'a pas l'air si joli, mais ça peut se faire automatiquement.

Une façon manuelle de le faire pourrait être:

const c = {
  category: 'category',
  foo: 'foo',
  bar: 'bar'
};

const category = c.category;
// Object.assign so as not to mutate the original object:
const rest = Object.assign({}, c);
delete rest.category;
console.log(rest);
3
CertainPerformance