Come ottenere un sottoinsieme delle proprietà di un oggetto javascript


425

Dì che ho un oggetto:

elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
};

Voglio creare un nuovo oggetto con un sottoinsieme delle sue proprietà.

 // pseudo code
 subset = elmo.slice('color', 'height')

 //=> { color: 'red', height: 'unknown' }

Come posso raggiungere questo obiettivo?


2
La libreria Underscore ha molte funzioni di supporto come questa, date un'occhiata: underscorejs.org/#pick
Stefan

4
Ho pensato che fosse detto emo.slicea prima vista.
Bill Criswell,

1
Ripensandoci ... Non creerò un sottoinsieme ...
Andrew,

Risposte:


675

Uso della distruzione degli oggetti e stenografia delle proprietà

const object = { a: 5, b: 6, c: 7  };
const picked = (({ a, c }) => ({ a, c }))(object);

console.log(picked); // { a: 5, c: 7 }


Da Philipp Kewisch:

Questa è davvero solo una funzione anonima chiamata all'istante. Tutto questo può essere trovato nella pagina di assegnazione di distruzione su MDN. Ecco una forma estesa

let unwrap = ({a, c}) => ({a, c});

let unwrap2 = function({a, c}) { return { a, c }; };

let picked = unwrap({ a: 5, b: 6, c: 7 });

let picked2 = unwrap2({a: 5, b: 6, c: 7})

console.log(picked)
console.log(picked2)


37
Come hai imparato a fare questo? Da nessuna parte in nessun documento o articolo che ho visto (incluso MDN) mostra la sintassi della freccia usata nella distruzione degli oggetti. Questo è molto bello da sapere.
papiro,

52
Questa è davvero solo una funzione anonima chiamata all'istante. Tutto questo può essere trovato nella pagina di assegnazione di distruzione su MDN. Ecco una forma estesa: let unwrap = ({a, c}) => ({a, c}); let unwrap2 = function({a, c}) { return { a, c }; }; let picked = unwrap({ a: 5, b: 6, c: 7 });
Philipp Kewisch,

8
c'è un modo per farlo in modo dinamico con l'operatore di diffusione?
Tom Sarduy,

4
@TomSarduy potresti usare riposo se vuoi specificare quali oggetti di scena rimuovere, ad es. const { b, ...picked } = objectCreare pickedcome { a: 5, c: 7 }. Hai specificato semplicemente per rimuovere b. Il tuo eslint probabilmente sarà infastidito da te per aver dichiarato un var che non stai usando, però.
Josh di Qaribou,

24
Uno svantaggio qui è che è necessario digitare due volte completamente la serie di nomi di attributi. Questo potrebbe essere piuttosto un problema nei casi in cui è necessario selezionare molti attributi.
Gershom,

144

Suggerisco di dare un'occhiata a Lodash ; ha molte grandi funzioni di utilità.

Ad esempio pick()sarebbe esattamente quello che cerchi:

var subset = _.pick(elmo, ['color', 'height']);

violino


2
lo stesso per underscore.js
Dan,

1
Esiste una funzione per escludere solo determinati campi invece di selezionare? quindi ho circa 50 campi nel mio json e voglio tutto tranne solo 2 campi.
Shrikant Prabhu,

7
Sì! puoi usare _.omit(elmo, ['voice'])per restituire tutto trannevoice
xavdid

ciò che non mi piace di questo approccio è che stai inserendo i nomi dei campi tra virgolette, quindi è suscettibile di errori di battitura, i refactoring comuni come rinominare una proprietà nel tuo IDE non la raccolgono, ecc. ecc.
Andy,

117

Se stai usando ES6 c'è un modo molto conciso per farlo usando la destrutturazione. La destrutturazione ti consente di aggiungere facilmente agli oggetti usando una diffusione, ma ti permette anche di creare oggetti sottoinsieme allo stesso modo.

const object = {
  a: 'a',
  b: 'b',
  c: 'c',
  d: 'd',
}

// Remove "c" and "d" fields from original object:
const {c, d, ...partialObject} = object;
const subset = {c, d};

console.log(partialObject) // => { a: 'a', b: 'b'}
console.log(subset) // => { c: 'c', d: 'd'};

6
questo funziona solo per rimuovere un campo, non per selezionare un sottoinsieme noto? potenzialmente un numero infinito di campi sconosciuti da rimuovere, ma potrebbe essere quello che alcune persone stanno cercando
Alexander Mills

È vero, ma può rimuovere diversi campi noti che possono quindi essere riassegnati a un nuovo oggetto in modo che sembri ancora rilevante per questa domanda. Aggiunto alla risposta per illustrare ulteriormente.
Lauren,

1
Questo è essenzialmente lo stesso della risposta di @Ivan Nosov , anche se qui è spiegato in un modo più comprensibile
icc97

81

Sebbene sia un po 'più prolisso, puoi ottenere ciò che tutti gli altri hanno raccomandato underscore / lodash per 2 anni fa, usando Array.prototype.reduce .

var subset = ['color', 'height'].reduce(function(o, k) { o[k] = elmo[k]; return o; }, {});

Questo approccio lo risolve dall'altro lato: piuttosto che prendere un oggetto e passargli i nomi delle proprietà per estrarlo, prendere una matrice di nomi di proprietà e ridurli in un nuovo oggetto.

Sebbene sia più dettagliato nel caso più semplice, un callback qui è piuttosto utile, poiché puoi facilmente soddisfare alcuni requisiti comuni, ad esempio cambiare la proprietà 'color' in 'color' sul nuovo oggetto, allineare gli array, ecc. le cose che devi fare quando ricevi un oggetto da un servizio / libreria e costruisci un nuovo oggetto necessario altrove. Mentre underscore / lodash sono librerie eccellenti e ben implementate, questo è il mio approccio preferito per una minore dipendenza dai fornitori e un approccio più semplice e coerente quando la mia logica di costruzione di sottogruppi diventa più complessa.

modifica: es7 versione della stessa:

const subset = ['color', 'height'].reduce((a, e) => (a[e] = elmo[e], a), {});

modifica: un bell'esempio anche per il curry! Avere una funzione 'pick' restituisce un'altra funzione.

const pick = (...props) => o => props.reduce((a, e) => ({ ...a, [e]: o[e] }), {});

Quanto sopra è abbastanza vicino all'altro metodo, tranne che ti consente di costruire un 'picker' al volo. per esempio

pick('color', 'height')(elmo);

La cosa particolarmente accurata di questo approccio è che puoi facilmente passare le 'scelte' scelte in tutto ciò che ha una funzione, ad esempio Array#map:

[elmo, grover, bigBird].map(pick('color', 'height'));
// [
//   { color: 'red', height: 'short' },
//   { color: 'blue', height: 'medium' },
//   { color: 'yellow', height: 'tall' },
// ]

3
es6 rende possibile che ciò sia ancora più pulito tramite le funzioni freccia e il ritorno di Object.assign (poiché l'assegnazione a una proprietà di oggetto restituisce il valore della proprietà, ma Object.assign restituisce l'oggetto.)
Josh da Qaribou

Un'altra nota es6: molto raramente dovrai farlo più, dato che in genere distruggi compiti o discussioni. ad esempio function showToy({ color, height }) {metterebbe solo ciò di cui hai bisogno nell'ambito. L' reduceapproccio ha senso soprattutto quando si semplificano gli oggetti per la serializzazione.
Josh di Qaribou,

6
Quella versione ES6 è meno performante, perché crea una copia di tutte le proprietà ad ogni iterazione. Effettua un'operazione O (n) in O (n ^ 2). Un equivalente ES6 del tuo primo blocco di codice sarebbeconst pick = (obj, props) => props.reduce((a, e) => (a[e] = obj[e], a), {});
4castle

@ 4castle sì bella chiamata - non ha senso iterare così tanto. Mi piace la sintassi della virgola - meglio di un sacco di rendimenti.
Josh di Qaribou,

1
@ShevchenkoViktor In realtà avevo usato quell'approccio nella mia versione es6 originale, ma l'ho cambiato dopo il commento di @ 4castle. Penso che la diffusione sia più chiara, ma è un'enorme differenza per gli oggetti più grandi nel codice che potrebbero essere facilmente colti da un collo di bottiglia (ad esempio ritardare il rendering dei dati restituiti fetch), quindi consiglierei di aggiungere un commento che spieghi l'uso dell'operatore virgola.
Josh da Qaribou l'

45

ES6 destrutturante

La sintassi di distruzione consente di destrutturare e ricombinare un oggetto, con parametri di funzione o variabili.

Il limite è che un elenco di chiavi è predefinito, non possono essere elencate come stringhe, come menzionato nella domanda. La distruzione diventa più complicata se una chiave non è alfanumerica, ad es foo_bar.

Il rovescio della medaglia è che questo richiede di duplicare un elenco di chiavi, questo si traduce in un codice dettagliato nel caso in cui un elenco sia lungo. Poiché in questo caso la destrutturazione dei duplicati oggetto sintassi letterale, un elenco può essere copiato e incollato così com'è.

Il lato positivo è che è la soluzione performante naturale per ES6.

IIFE

let subset = (({ foo, bar }) => ({ foo, bar }))(obj); // dupe ({ foo, bar })

Variabili temporanee

let { foo, bar } = obj;
let subset = { foo, bar }; // dupe { foo, bar }

Un elenco di stringhe

L'elenco arbitrario delle chiavi selezionate è costituito da stringhe, come richiesto dalla domanda. Ciò consente di non predefinirli e utilizzare variabili che contengono nomi di chiavi, come pick(obj, 'foo', someKey, ...moreKeys).

Un one-liner diventa più corto con ogni edizione JS.

ES5

var subset = Object.keys(obj)
.filter(function (key) { 
  return ['foo', 'bar'].indexOf(key) >= 0;
})
.reduce(function (obj2, key) {
  obj2[key] = obj[key];
  return obj2;
}, {});

ES6

let subset = Object.keys(obj)
.filter(key => ['foo', 'bar'].indexOf(key) >= 0)
.reduce((obj2, key) => Object.assign(obj2, { [key]: obj[key] }), {});

O con operatore virgola:

let subset = Object.keys(obj)
.filter(key => ['foo', 'bar'].indexOf(key) >= 0)
.reduce((obj2, key) => (obj2[key] = obj[key], obj2), {});

ES2019

ECMAScript 2017 ha Object.entriese Array.prototype.includes, ECMAScript 2019 ha Object.fromEntries, possono essere polifillati quando necessario e semplificare l'attività:

let subset = Object.fromEntries(
  Object.entries(obj)
  .filter(([key]) => ['foo', 'bar'].includes(key))
)

Un one-liner può essere riscritto come funzione di supporto simile a Lodashpick o in omitcui l'elenco di chiavi viene passato attraverso argomenti:

let pick = (obj, ...keys) => Object.fromEntries(
  Object.entries(obj)
  .filter(([key]) => keys.includes(key))
);

let subset = pick({ foo: 1, qux: 2 }, 'foo', 'bar'); // { foo: 1 }

Una nota sulle chiavi mancanti

La principale differenza tra la destrutturazione e la tradizionale pickfunzione simile a Lodash è che la destrutturazione include chiavi scelte inesistenti con undefinedvalore in un sottoinsieme:

(({ foo, bar }) => ({ foo, bar }))({ foo: 1 }) // { foo: 1, bar: undefined }

Questo comportamento può essere o meno desiderabile. Non può essere modificato per la sintassi destrutturante.

Mentre pickpuò essere modificato per includere le chiavi mancanti ripetendo invece un elenco di chiavi selezionate:

let inclusivePick = (obj, ...keys) => Object.fromEntries(
  keys.map(key => [key, obj[key]])
);

let subset = inclusivePick({ foo: 1, qux: 2 }, 'foo', 'bar'); // { foo: 1, bar: undefined }

11
Che peccato che questa risposta sia così recente e quindi non ottenga l'esposizione che merita. IMO dovrebbe essere la risposta accettata per completezza, semplicità, versatilità e correttezza. Terrò la versione ES6 nella mia libreria di frammenti più utile.
VanAlbert,

ES5 - "Errore di riferimento non
rilevato

@NikhilVartak Si prevede che la objvariabile sia una variabile che memorizza un oggetto. Se il nome della tua variabile è diverso, usalo al posto di obj.
Estus Flask

Colpa mia! Ho trascurato Object.keys(obj). Sleepy.
Nikhil Vartak,

34

Non c'è niente di simile a quello incorporato nella libreria principale, ma puoi usare la distruzione degli oggetti per farlo ...

const {color, height} = sourceObject;
const newObject = {color, height};

Puoi anche scrivere una funzione di utilità fallo ...

const cloneAndPluck = function(sourceObject, keys) {
    const newObject = {};
    keys.forEach((obj, key) => { newObject[key] = sourceObject[key]; });
    return newObject;
};

const subset = cloneAndPluck(elmo, ["color", "height"]);

Biblioteche come Lodash hanno anche _.pick().


1
fantastico, ho dovuto cambiare forEach in: keys.forEach (key => {newObject [key] = sourceObject [key];}) ;. Per favore, aggiorna il commento se questo ha senso.
Kandan,

34

Sto aggiungendo questa risposta perché nessuna delle risposte utilizzate Comma operator.

È molto facile con destructuring assignmente ,operatore

const object = { a: 5, b: 6, c: 7  };
const picked = ({a,c} = object, {a,c})

console.log(picked);

Con un certo miglioramento per l'assegnazione delle proprietà dinamiche potrebbe apparire così:


2
mio male, non so cosa ho fatto prima che non funzionasse ma sembra funzionare
ekkis

1
Questa è l'espressione migliore, quando si tratta di destrutturare
Mohamed Allal,

1
questa soluzione è intelligente, ma non funziona in modalità rigorosa (ad es 'use strict'.). Ho un ReferenceError: a is not defined.
Kimbaudi,

8
Si noti che questo approccio inquina l'ambito corrente con due variabili ae c- fare attenzione a non sovrascrivere casualmente le variabili locali o globali a seconda del contesto. (La risposta accettata evita questo problema utilizzando due variabili locali in una funzione incorporata, che non rientra nell'ambito di applicazione dopo l'esecuzione immediata.)
mindplay.dk

2
L'inquinamento dello spazio dei nomi lo rende completamente poco pratico. È estremamente comune avere già delle variabili nell'ambito che corrispondono alle proprietà dell'oggetto, ecco perché esiste la stenografia + la destrutturazione. Molto probabilmente avrai altezza o colore già definiti come nell'esempio originale.
Josh di Qaribou

23

Un'altra soluzione:

var subset = {
   color: elmo.color,
   height: elmo.height 
}

Mi sembra molto più leggibile di qualsiasi risposta finora, ma forse sono solo io!


9
Preferisco essere produttivo piuttosto che essere codice elegante ma confuso, e nella progettazione del software nella vita reale questa è di gran lunga la soluzione più leggibile e mantenibile.
Janos,

1
Sì, tuttavia, per me, un lato positivo dell'uso della notazione destrutturante e abbreviata è che è meno soggetto a errori. Se avessi avuto un penny per ogni volta che avessi erroneamente copiato e incollato il codice per finire subset = {color: elmo.color, height: elmo.color}, avrei avuto almeno un ... beh, forse un centesimo.
JHH il

Non definirei la stenografia destrutturante meno soggetta a errori in quanto non è ASCIUTTA
gman

Dovrei essere d'accordo. Senza inquinare il contesto con variabili indesiderate, questa è di gran lunga la soluzione più leggibile. Il resto sembra troppo confuso. Preferisco capire il mio codice nel momento in cui lo guardo.
Andrew,

11

Puoi usare anche Lodash .

var subset = _.pick(elmo ,'color', 'height');

Supponiamo che tu abbia una serie di "elmo" s:

elmos = [{ 
      color: 'red',
      annoying: true,
      height: 'unknown',
      meta: { one: '1', two: '2'}
    },{ 
      color: 'blue',
      annoying: true,
      height: 'known',
      meta: { one: '1', two: '2'}
    },{ 
      color: 'yellow',
      annoying: false,
      height: 'unknown',
      meta: { one: '1', two: '2'}
    }
];

Se vuoi lo stesso comportamento, usando lodash, dovresti semplicemente:

var subsets = _.map(elmos, function(elm) { return _.pick(elm, 'color', 'height'); });

10

La distruzione in variabili con nome dinamico è impossibile in JavaScript come discusso in questa domanda .

Per impostare i tasti in modo dinamico , è possibile utilizzare la funzione di riduzione senza mutare l'oggetto come segue:

const getSubset = (obj, ...keys) => keys.reduce((a, c) => ({ ...a, [c]: obj[c] }), {});

const elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
}

const subset = getSubset(elmo, 'color', 'annoying')
console.log(subset)

Dovresti notare che stai creando un nuovo oggetto su ogni iterazione invece di aggiornare un singolo clone. - mpen

di seguito è una versione che utilizza la riduzione con un singolo clone (aggiornamento del valore iniziale passato per ridurre).

const getSubset = (obj, ...keys) => keys.reduce((acc, curr) => {
  acc[curr] = obj[curr]
  return acc
}, {})

const elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
}

const subset = getSubset(elmo, 'annoying', 'height', 'meta')
console.log(subset)


1
Eccezionale! Mi ha gettato per un momento non rendendomi conto di quanto siano essenziali le parentesi su [c]:. Suppongo che stia causando in qualche modo c come valore anziché come nome della proprietà. Comunque, molto bello. +1
John Fairbanks

Grazie compagno! Questo utilizzo è una cosa che adoro di JavaScript che abilita le funzioni generiche senza usare eval. Semplicemente, ciò che crea è che consente di impostare una chiave di dict su una variabile in fase di esecuzione. se definisci var key = 'someKey', puoi usarlo come {[key]: 'value'}, che ti dà {someKey: 'value'}. Veramente cool.
Muhammet Enginar,

1
Dovresti notare che stai creando un nuovo oggetto su ogni iterazione invece di aggiornare un singolo clone.
mpen

1
@mpen buona scoperta. Ho aggiunto una versione che muta il singolo clone come hai suggerito anche di diffondere args invece di passare una matrice di chiavi.
Muhammet Enginar

7

Soluzione TypeScript:

export function pick<T extends object, U extends keyof T>(obj: T, paths: Array<U>) {
    return paths.reduce((o, k) => {
        o[k] = obj[k];
        return o;
    }, Object.create(null));
}

Le informazioni di digitazione consentono anche il completamento automatico:

Ringraziamo DefinitelyTyped per il U extends keyof Ttrucco!


Non funziona per me.
Nuthinking

@Nuthinking Stai usando il codice VS?
mpen

si, uso il codice VS.
Nuthinking

@Nuthinking E lo metti in un file .ts? Dovrebbe funzionare. Ho appena provato di nuovo
mpen


4

Soluzione dinamica

['color', 'height'].reduce((a,b) => (a[b]=elmo[b],a), {})


3

Solo un altro modo ...

var elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
}

var subset = [elmo].map(x => ({
  color: x.color,
  height: x.height
}))[0]

È possibile utilizzare questa funzione con una matrice di oggetti =)


2

Che ne dite di:

function sliceObj(obj) {
  var o = {}
    , keys = [].slice.call(arguments, 1);
  for (var i=0; i<keys.length; i++) {
    if (keys[i] in obj) o[keys[i]] = obj[keys[i]];
  }
  return o;
}

var subset = sliceObj(elmo, 'color', 'height');

Ciò fallirebbe se il valore della proprietà fosse false(o falsa). jsfiddle.net/nfAs8
Alxandr il

Ecco perché l'ho cambiato keys[i] in obj.
elclanrs,

2

Questo funziona per me nella console di Chrome. Qualche problema con questo?

var { color, height } = elmo
var subelmo = { color, height }
console.log(subelmo) // {color: "red", height: "unknown"}

4
Sembra bello, ma crea due variabili non necessarie, colore e altezza.
user424174

Non capisco il tuo commento. Il requisito di OP era di creare un oggetto con questi due elementi
MSi

@MSi Questo non solo crea un oggetto, ma crea anche due variabili.
Design di Adrian,

1

Assegnazione di ristrutturazione con proprietà dinamiche

Questa soluzione non si applica solo al tuo esempio specifico ma è più in generale applicabile:

const subset2 = (x, y) => ({[x]:a, [y]:b}) => ({[x]:a, [y]:b});

const subset3 = (x, y, z) => ({[x]:a, [y]:b, [z]:c}) => ({[x]:a, [y]:b, [z]:c});

// const subset4...etc.


const o = {a:1, b:2, c:3, d:4, e:5};


const pickBD = subset2("b", "d");
const pickACE = subset3("a", "c", "e");


console.log(
  pickBD(o), // {b:2, d:4}
  pickACE(o) // {a:1, c:3, e:5}
);

È possibile definire facilmente subset4ecc. Per tenere conto di più proprietà.


1

Buon vecchio Array.prototype.reduce:

const selectable = {a: null, b: null};
const v = {a: true, b: 'yes', c: 4};

const r = Object.keys(selectable).reduce((a, b) => {
  return (a[b] = v[b]), a;
}, {});

console.log(r);

questa risposta utilizza l'operatore virgola magico, anche: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator

se vuoi essere davvero fantasioso, questo è più compatto:

const r = Object.keys(selectable).reduce((a, b) => (a[b] = v[b], a), {});

Mettendo tutto insieme in una funzione riutilizzabile:

const getSelectable = function (selectable, original) {
  return Object.keys(selectable).reduce((a, b) => (a[b] = original[b], a), {})
};

const r = getSelectable(selectable, v);
console.log(r);

1
  1. convertire argomenti in array

  2. utilizzare Array.forEach()per selezionare la proprietà

    Object.prototype.pick = function(...args) {
       var obj = {};
       args.forEach(k => obj[k] = this[k])
       return obj
    }
    var a = {0:"a",1:"b",2:"c"}
    var b = a.pick('1','2')  //output will be {1: "b", 2: "c"}

4
L'estensione del prototipo di tipi nativi è considerata una cattiva pratica, sebbene funzionerebbe. Non farlo se stai scrivendo una biblioteca.
Emile Bergeron,

0
function splice()
{
    var ret = new Object();

    for(i = 1; i < arguments.length; i++)
        ret[arguments[i]] = arguments[0][arguments[i]];

    return ret;
}

var answer = splice(elmo, "color", "height");

0

Provare

const elmo={color:"red",annoying:!0,height:"unknown",meta:{one:"1",two:"2"}};

const {color, height} = elmo; newObject = ({color, height});

console.log(newObject); //{ color: 'red', height: 'unknown' }

0

Aggiungendo i miei 2 centesimi a risposta Ivan Nosov :

Nel mio caso avevo bisogno di molte chiavi per essere "tagliate" fuori dall'oggetto, quindi sta diventando brutto molto velocemente e non è una soluzione molto dinamica:

const object = { a: 5, b: 6, c: 7, d: 8, aa: 5, bb: 6, cc: 7, dd: 8, aaa: 5, bbb: 6, ccc: 7, ddd: 8, ab: 5, bc: 6, cd: 7, de: 8  };
const picked = (({ a, aa, aaa, ab, c, cc, ccc, cd }) => ({ a, aa, aaa, ab, c, cc, ccc, cd }))(object);

console.log(picked);

Ecco quindi una soluzione dinamica che utilizza eval:

const slice = (k, o) => eval(`(${k} => ${k})(o)`);


const object    = { a: 5, b: 6, c: 7, d: 8, aa: 5, bb: 6, cc: 7, dd: 8, aaa: 5, bbb: 6, ccc: 7, ddd: 8, ab: 5, bc: 6, cd: 7, de: 8  };
const sliceKeys = '({ a, aa, aaa, ab, c, cc, ccc, cd })';

console.log( slice(sliceKeys, object) );

-2

Nota: sebbene la domanda originale fosse per javascript, è possibile eseguire jQuery con la soluzione seguente

puoi estendere jquery se vuoi ecco il codice di esempio per una sezione:

jQuery.extend({
  sliceMe: function(obj, str) {
      var returnJsonObj = null;
    $.each( obj, function(name, value){
        alert("name: "+name+", value: "+value);
        if(name==str){
            returnJsonObj = JSON.stringify("{"+name+":"+value+"}");
        }

    });
      return returnJsonObj;
  }
});

var elmo = { 
  color: 'red',
  annoying: true,
  height: 'unknown',
  meta: { one: '1', two: '2'}
};


var temp = $.sliceMe(elmo,"color");
alert(JSON.stringify(temp));

ecco il violino per lo stesso: http://jsfiddle.net/w633z/


16
Che cos'è jquery?
Christian Schlensker,

1
@ChristianSchlensker è javascript
Kevin B
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.