Soru JavaScript: Nesnenin ilk ve tek özellik ismini al


Bir nesnenin özelliklerini numaralandırmak ve prototipleri göz ardı etmek istiyorsanız, şunu kullanırım:

var instance = { ... };

for (var prop in instance) {
    if (instance.hasOwnProperty(prop)) {
        ... 
    }
}

Farzedelim instance sadece bir mülk var ve bu mülk ismini almak istiyorum? Bunu yapmanın daha kolay bir yolu var mı:

var instance = { id: "foobar" };

var singleMember = (function() {
    for (var prop in instance) {
        if (instance.hasOwnProperty(prop)) {
            return prop;
        }
    }
})();

32
2017-07-20 17:22


Menşei


Doğru fikre sahip olduğunuzu düşünüyorum, mantığı bir yardımcı fonksiyonda sarın, sonra kullanımı daha kolay olacaktır. ;) - Peter
ES5 özelliklerinin, for-in veya Object.keys için özelliklerin sırasını tanımlamadığı belirtilmelidir. Sadece bir sipariş varsa, hem for-in hem de Object.keys aynı şeyi kullanması gerektiğini söylüyor. Çoğu tarayıcılar siparişi kullansalar da özellikler tanımlandı, ancak buna bağlı olmayacağım. - Ben


Cevaplar:


Olabilir Object.keys senin için çalışabilirim. Uzunluğu 1 döndürürse, kullanabilirsiniz yourObject[Objects.keys[0]] nesnenin tek özelliğini almak için. MDN-link ayrıca, ortamlarda kullanılmayan özel bir işlev de gösterir. keys yöntem1. Kod şöyle:

var obj = {foo:'bar'}, 
    kyz = Object.keys(obj);
if (kyz.length === 1){
   alert(obj[kyz[0]]); //=> 'bar'
} else {
  /* loop through obj */
}

1 Bazı eski tarayıcılar desteklenmiyor Object.keys. MDN bağlantısı, bu tarayıcılarda da çalışmasını sağlamak için kod sağlar. Başlığa bakın uygunluk daha önce belirtilen MDN sayfası


41
2017-07-20 17:27





En kısa biçim:

instance[Object.keys(instance)[0]];

ES6 + işlevi:

let first = v => v[Object.keys(v)[0]];

İşlevi kullanın:

first({a:'first', b:'second'}) // return 'first'

11
2018-06-20 04:34





Ne yazık ki, yerleşik "liste özellikleri" işlevi yoktur ve kesinlikle "getFirstProperty" yoktur (özellikle herhangi bir özelliğin sürekli olarak "ilk" olması garanti edilmediğinden).

Sanırım bunun gibi bir işlev yazmaktan daha iyisin:

/**
 * A means to get all of the keys of a JSON-style object.
 * @param obj The object to iterate
 * @param count maximum length of returned list (defaults to Infinity).
 */
function getProperties( obj, count )
{
    if( isNaN( count ) ) count = Infinity
    var keys = []
    for( var it in obj )
    {
        if( keys.length > count ) break;
        keys.push( it );
    }
    return keys;
}

Sonra, yine de isme erişebilirsiniz:

instance = {"foo":"bar"}
// String() on an array of < 2 length returns the first value as a string
// or "" if there are no values.
var prop = String(getProperties(instance, 1));

2
2017-07-20 17:30



Eğer soruda belirtildiği gibi sadece 1 mülkünüz varsa, her zaman ilk olmanız garanti edilir. :) - Alexander Ljungberg


Cevabım reddedilmiş olsa da, hala olduğunu bilmeye değer. yok hayır javascript nesnesindeki tuşların sırası gibi bir şey. Bu nedenle, teoride, yinelenen değerler üzerinde yapılan herhangi bir kod uyuşmazlığı olabilir. Bir yaklaşım, bir nesne oluşturmak ve sayımı, siparişi vermek ve benzeri şeyleri sağlayan setçiyi tanımlamak ve bu alanlara erişmek için bazı yöntemler sağlamak olabilir. Bu modern tarayıcılarda yapılabilirdi.

Yani, size soru cevaplamak için, genellikle yaklaşım, hala çoğu tarayıcı tarayıcıdır. Sizden "hasOwnProperty" karmaşıklığını gizleyecek lodash veya başka bir modern framework kullanarak yineleyin. Ağustos itibarıyla15 Object.keys  çapraz tarayıcı ve evrensel olarak kabul edilebilir. Tüm IE8 yıllar sonra oldu. Hala dizideki tüm anahtar kümelerini saklamadığınız bazı durumlar var. Ama Object.keys ile giderdim - yineleme ile karşılaştırıldığında daha esnek.


1
2017-07-20 17:36





Bu eski bir yazıdır, ancak aşağıdaki yardımcı işlevini yazmayı bitirdim. Object.keys ().

Döndürür key ve value ilk mülkün

getFirstPropertyKeyAndValue(sourceObject) {
    var result = null;
    var ownProperties = Object.keys(sourceObject);
    if (ownProperties.length > 0) {
      if (ownProperties.length > 1) {
        console.warn('Getting first property of an object containing more than 1 own property may result in unexpected results. Ordering is not ensured.', sourceObject);
      }
      var firstPropertyName = ownProperties[0];
      result = {key: firstPropertyName, value: sourceObject[firstPropertyName]};
    }
    return result;
  }

0
2017-09-30 12:58