JavaScript Object.keys () méthode alternative pour la compatibilité avec IE8

Je suis en erreur lors du test dans IE8 que la méthode Object n'est pas prise en charge. J'utilise Object.keys()

 Object.keys(jsoncont).sort(function(a,b){ return b.localeCompare(a) }).forEach(function(key) { var val = jsoncont[key]; /* My code here */ }); } 

Existe-t-il une bonne solution de rechange pour cette méthode prise en charge par IE8?

Mozilla a une explication de la façon de polyfiller la fonction dans les navigateurs plus anciens: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

 // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys if (!Object.keys) { Object.keys = (function () { 'use strict'; var hasOwnProperty = Object.prototype.hasOwnProperty, hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'), dontEnums = [ 'toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor' ], dontEnumsLength = dontEnums.length; return function (obj) { if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) { throw new TypeError('Object.keys called on non-object'); } var result = [], prop, i; for (prop in obj) { if (hasOwnProperty.call(obj, prop)) { result.push(prop); } } if (hasDontEnumBug) { for (i = 0; i < dontEnumsLength; i++) { if (hasOwnProperty.call(obj, dontEnums[i])) { result.push(dontEnums[i]); } } } return result; }; }()); } 

Si jsoncont est un objet, vous pouvez utiliser for...in

 for (var key in jsoncont) { ... } 

Ou comme suggéré dans this blog post , vous pouvez le créer comme ça

 if (!Object.keys) Object.keys = function(o) { if (o !== Object(o)) throw new TypeError('Object.keys called on a non-object'); var k=[],p; for (p in o) if (Object.prototype.hasOwnProperty.call(o,p)) k.push(p); return k; } 

Le code suivant prend en charge (en utilisant MDN docs) tous les navigateurs (IE6 +) qui n'ont pas encore été testés dans les IE.

 function getKeys(obj) { var keys = []; iterate(obj, function (oVal, oKey) { keys.push(oKey) }); return keys; } function iterate(iterable, callback) { for (var key in iterable) { if (key === 'length' || key === 'prototype' || !Object.prototype.hasOwnProperty.call(iterable, key)) continue; callback(iterable[key], key, iterable); } } 

Vous pouvez le vérifier en utilisant le contrôleur de compatibilité js

Ce que nous avons ici:

  1. for...in Tous les navigateurs (IE6 +)
  2. hasOwnProperty Tous les navigateurs
  3. Function.prototype.call Tous les navigateurs
  4. continue Tous les navigateurs
  5. Array.prototype.push Tous les navigateurs (IE 5.5 +)

Sommaire: support IE 6+

Notez que vous pouvez utiliser la fonction iterate pour itérer des objects et des arrays selon votre souhait (IE 6+).