Ottenere il primo indice di un oggetto


201

Tener conto di:

var object = {
  foo: {},
  bar: {},
  baz: {}
}

Come farei questo:

var first = object[0];
console.log(first);

Ovviamente, ciò non funziona perché il primo indice è denominato foo, non 0.

console.log(object['foo']);

funziona, ma non so che si chiama foo. Potrebbe essere chiamato qualsiasi cosa. Voglio solo il primo.

Risposte:


61

Se l'ordine degli oggetti è significativo, è necessario rivedere lo schema JSON per archiviare gli oggetti in un array:

[
    {"name":"foo", ...},
    {"name":"bar", ...},
    {"name":"baz", ...}
]

o forse:

[
    ["foo", {}],
    ["bar", {}],
    ["baz", {}]
]

Come sottolinea Ben Alpert, le proprietà degli oggetti Javascript non sono ordinate e il tuo codice viene interrotto se prevedi che vengano enumerate nello stesso ordine in cui sono specificate nell'oggetto letterale: non esiste una proprietà "prima".


6
Non ho mai visto per (i in obj) fare le cose in un ordine diverso, stai dicendo che a volte per (i in obj) cacciamo le cose in un ordine diverso?
Ryan Florence,

4
È possibile che lo farà. Le specifiche dicono che non deve essere elencato in un ordine specifico. Questo praticamente significa che quell'ordine potrebbe cambiare.
PatrikAkerstrand,

5
La maggior parte dei browser oggigiorno mantiene l'ordine di inserimento, ma non è sempre stato così; non è richiesto dalle specifiche e c'erano versioni recenti di Chrome che non conservavano l'ordine di inserzione.
Miglia,

1
Man mano che approfondivo ciò che stavo facendo, l'ordine delle cose è diventato più importante (pensavo di occuparmi solo del primo, ma mi sbagliavo!), Quindi è stato chiaro archiviare i miei oggetti in un array come hai suggerito.
Ryan Florence,

1
Se sai che l'oggetto ha un solo elemento, allora conosci l'ordine.
danorton,

329

Solo per divertimento funziona in JS 1.8.5

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

Questo corrisponde allo stesso ordine che vedresti fare

for (o in obj) { ... }

24
Chiaramente l'opzione migliore a meno che non sia richiesta la compatibilità con le backword dell'età della pietra.
Dag Sondre Hansen,

1
100% la risposta migliore. Questo è il modo più semplice e veloce per farlo.
Caso

3
Solo per chiarire, secondo en.wikipedia.org/wiki/JavaScript#Version_history JS 1.8.5 non è supportato prima di IE9. Purtroppo molte persone sono ancora nell'età della pietra.
Noremac,

Grande. Breve e semplice Grazie @Jacob
Sariban D'Cl

se qualcuno sta usando IE9 😏 sento il suo dolore. grazie è incredibile
CMS

204

Se vuoi qualcosa di conciso prova:

for (first in obj) break;

alert(first);

avvolto in funzione:

function first(obj) {
    for (var a in obj) return a;
}

8
Vedi la risposta di Luke Schafer di seguito, utilizza il metodo hasOwnProperty per assicurarti di non afferrare i membri del prototipo.
Codice comandante

3
Per far funzionare una sola riga in tutti i browser, incluso IE8 e successivi, for (var key in obj) if (obj.hasOwnProperty(key)) break;ti consigliamo di utilizzare la keyvariabile
Ally,

non funziona se il primo elemento è un tipo di oggetto. ritorna 0
neve

Object.keys(obj)[0];è molto più veloce (0.072ms) di for(1.644ms).
Sebastian Ortmann,

77

non sono realmente ordinati, ma puoi fare:

var first;
for (var i in obj) {
    if (obj.hasOwnProperty(i) && typeof(i) !== 'function') {
        first = obj[i];
        break;
    }
}

la .hasOwnProperty()è importante per ignorare oggetti prototipizzato.


Si è verificato un errore nel codice sopra. Il controllo typeof dovrebbe essere typeof (i)
jacob.toye il

@Napalm si riferiva all'errore nel nome della variabile da controllare, non alla sintassi. Hai ragione, ma a molte persone piace il bracketing per la leggibilità
Luke Schafer,

Grazie. È fantastico.
Santosh,

76

Questo non ti darà il primo in quanto gli oggetti javascript non sono ordinati, tuttavia in alcuni casi va bene.

myObject[Object.keys(myObject)[0]]

39

per la prima chiave dell'oggetto che puoi usare

console.log(Object.keys(object)[0]);//print key's name

per valore

console.log(object[Object.keys(object)[0]]);//print key's value

18

Non è possibile ottenere il primo elemento, visto che gli "hash" (oggetti) in JavaScript hanno proprietà non ordinate. La tua scommessa migliore è di memorizzare le chiavi in ​​un array:

var keys = ["foo", "bar", "baz"];

Quindi usalo per ottenere il valore corretto:

object[keys[0]]

16

ES6

const [first] = Object.keys(obj)

Funziona, ma puoi spiegare come funziona? Basta mostrare il codice non riesce a farmelo capire.
Daan,

1
È un compito distruttivo . In sostanza, assegna il primo elemento dell'array restituito alla variabile tra parentesi quadre.
Richard Ayotte,

12

Usando il trattino basso puoi usare _.pairs per ottenere la prima voce dell'oggetto come coppia chiave-valore come segue:

_.pairs(obj)[0]

Quindi la chiave sarebbe disponibile con un ulteriore [0]pedice, il valore con[1]


Funziona meglio quando underscore.js viene utilizzato. Proprio quello di cui avevo bisogno ... Grazie, George!
Goldengalaxy,

10

Ho avuto lo stesso problema ieri. L'ho risolto in questo modo:

var obj = {
        foo:{},
        bar:{},
        baz:{}
    },
   first = null,
   key = null;
for (var key in obj) {
    first = obj[key];
    if(typeof(first) !== 'function') {
        break;
    }
}
// first is the first enumerated property, and key it's corresponding key.

Non è la soluzione più elegante, e sono abbastanza sicuro che potrebbe produrre risultati diversi in diversi browser (ad esempio, le specifiche dicono che non è richiesta l'enumerazione per enumerare le proprietà nello stesso ordine in cui sono state definite). Tuttavia, avevo una sola proprietà nel mio oggetto, quindi non era un problema. Avevo solo bisogno della prima chiave.


1
Ciao @PatrikAkerstrand all'inizio ho accidentalmente cliccato su downvote. Ti preghiamo di apportare qualsiasi modifica alla tua risposta per annullarla. Scusate.
rogeriolino,

7

Potresti fare qualcosa del genere:

var object = {
    foo:{a:'first'},
    bar:{},
    baz:{}
}


function getAttributeByIndex(obj, index){
  var i = 0;
  for (var attr in obj){
    if (index === i){
      return obj[attr];
    }
    i++;
  }
  return null;
}


var first = getAttributeByIndex(object, 0); // returns the value of the
                                            // first (0 index) attribute
                                            // of the object ( {a:'first'} )

6

Per ottenere la prima chiave del tuo oggetto

const myObject = {
   'foo1': { name: 'myNam1' },
   'foo2': { name: 'myNam2' }
}

const result = Object.keys(myObject)[0];

// result will return 'foo1'

Qual è la differenza tra questa risposta e quella di Jacob?
YakovL

dà più sicurezza al fatto che questo tipo di codice funzioni perfettamente.
Santosh,

5

Basato sulla risposta CMS . Non ottengo direttamente il valore, invece prendo la chiave nel suo indice e lo utilizzo per ottenere il valore:

Object.keyAt = function(obj, index) {
    var i = 0;
    for (var key in obj) {
        if ((index || 0) === i++) return key;
    }
};


var obj = {
    foo: '1st',
    bar: '2nd',
    baz: '3rd'
};

var key = Object.keyAt(obj, 1);
var val = obj[key];

console.log(key); // => 'bar'
console.log(val); // => '2nd'

2

La mia soluzione:

Object.prototype.__index = function(index)
{
    var i = -1;
    for (var key in this)
    {
        if (this.hasOwnProperty(key) && typeof(this[key])!=='function')
            ++i;
        if (i >= index)
            return this[key];
    }
    return null;
}
aObj = {'jack':3, 'peter':4, '5':'col', 'kk':function(){alert('hell');}, 'till':'ding'};
alert(aObj.__index(4));

12
bello, solo ... il tuo stile di programmazione! che diavolo? quelle parentesi graffe sono ovunque!
pecora volante

2
Conosci lo stile pitone? Ho appena aggiunto parentesi graffe allineate verticalmente in stile pitone. Comunque, "L'inferno è altra gente",
MrGreen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.