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:
for...in
Tous les navigateurs (IE6 +) hasOwnProperty
Tous les navigateurs Function.prototype.call
Tous les navigateurs continue
Tous les navigateurs 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+).