سؤال

أعلم أن الكائنات في جافا سكريبت تتضاعف كتجزئة ولكنني لم أتمكن من العثور على وظيفة مضمنة للحصول على المفاتيح

var h = {a:'b',c:'d'};

أريد شيئا مثل

var k = h.keys() ; // k = ['a','c'];

من السهل أن أكتب دالة بنفسي لتكرارها على العناصر وإضافة المفاتيح إلى المصفوفة التي أرجعها، ولكن هل هناك طريقة أنظف قياسية للقيام بذلك؟

ما زلت أشعر أنها يجب أن تكون وظيفة بسيطة مدمجة فاتني ولكن لا يمكنني العثور عليها!

هل كانت مفيدة؟

المحلول

هناك وظيفة في JavaScript الحديثة (ECMAScript 5) تسمى Object.keys تنفيذ هذه العملية:

var obj = { "a" : 1, "b" : 2, "c" : 3};
alert(Object.keys(obj)); // will output ["a", "b", "c"]

يمكن العثور على تفاصيل التوافق هنا.

على ال موقع موزيلا يوجد أيضًا مقتطف للتوافق مع الإصدارات السابقة:

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

نصائح أخرى

بالنسبة لرمز الإنتاج الذي يتطلب توافقًا كبيرًا مع متصفحات العميل، ما زلت أقترح إجابة إيفان نيفوسترويف أعلاه باستخدام الرقائق لضمان Object.keys في المتصفحات القديمة.ومع ذلك، من الممكن الحصول على الوظيفة المطلوبة بالضبط باستخدام الإصدار الجديد من ECMA defineProperty ميزة.

اعتبارًا من ECMAScript 5 - Object.defineProperty

اعتبارًا من ECMA5 يمكنك استخدامه Object.defineProperty() لتحديد خصائص غير قابلة للإحصاء.ال التوافق الحالي لا يزال هناك الكثير مما هو مرغوب فيه، ولكن يجب أن يصبح هذا قابلاً للاستخدام في النهاية في جميع المتصفحات.(لاحظ على وجه التحديد عدم التوافق الحالي مع IE8!)

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    var keys = [];
    for(var i in this) if (this.hasOwnProperty(i)) {
      keys.push(i);
    }
    return keys;
  },
  enumerable: false
});

var o = {
    'a': 1,
    'b': 2
}

for (var k in o) {
    console.log(k, o[k])
}

console.log(o.keys())

# OUTPUT
# > a 1
# > b 2
# > ["a", "b"]

ومع ذلك، منذ إضافة ECMA5 بالفعل Object.keys قد تستخدم أيضًا:

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    return Object.keys(this);
  },
  enumerable: false
});

الجواب الأصلي

Object.prototype.keys = function ()
{
  var keys = [];
  for(var i in this) if (this.hasOwnProperty(i))
  {
    keys.push(i);
  }
  return keys;
}

يحرر: نظرًا لأن هذه الإجابة كانت موجودة منذ فترة سأترك ما ورد أعلاه دون تغيير.يجب على أي شخص يقرأ هذا أن يقرأ أيضًا إجابة إيفان نيفوسترويف أدناه.

لا توجد طريقة لجعل وظائف النموذج الأولي غير قابلة للإحصاء مما يؤدي إلى ظهورها دائمًا في حلقات for-in التي لا تستخدم hasOwnProperty.ما زلت أعتقد أن هذه الإجابة ستكون مثالية إذا لم يكن توسيع النموذج الأولي للكائن فوضويًا للغاية.

يمكنك استخدام Object.keys

Object.keys(h)

يمكنك استخدام تسطير أسفل السطر.js, ، وهي مكتبة مساعدة لجافا سكريبت.

_.keys({one : 1, two : 2, three : 3}); 
// => ["one", "two", "three"]

وهذا أفضل ما يمكنك فعله، على حد علمي..

var keys = [];
for (var k in h)keys.push(k);

استخدام مسج يمكنك الحصول على المفاتيح مثل هذا:

var bobject =  {primary:"red",bg:"maroon",hilite:"green"};
var keys = [];
$.each(bobject, function(key,val){ keys.push(key); });
console.log(keys); // ["primary", "bg", "hilite"]

أو:

var bobject =  {primary:"red",bg:"maroon",hilite:"green"};
$.map(bobject, function(v,k){return k;});

بفضلpimlottc

أعتقد أنه يمكنك تكرار خصائص الكائن باستخدام for/in، لذا يمكنك القيام بشيء مثل هذا:

function getKeys(h) {
  Array keys = new Array();
  for (var key in h)
    keys.push(key);
  return keys;
}

كنت أرغب في استخدام الإجابة الأعلى تقييمًا أعلاه

Object.prototype.keys = function () ...

ومع ذلك، عند الاستخدام مع الإصدار 3 من واجهة برمجة تطبيقات خرائط جوجل، تصبح خرائط جوجل غير فعالة.

for (var key in h) ...

يعمل بشكل جيد.

إذا كنت تحاول الحصول على العناصر فقط وليس الوظائف، فيمكن أن يساعدك هذا الرمز

this.getKeys = function() {

var keys = new Array();
for(var key in this) {

    if( typeof this[key] !== 'function') {

        keys.push(key);
    }
}
return keys;

}

هذا جزء من تنفيذي لـ HashMap وأريد المفاتيح فقط، this هو كائن hashmap الذي يحتوي على المفاتيح

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top