Vreau pentru a converti un obiect de genul asta:
{"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
într-o serie de perechi cheie-valoare astfel:
[[1,5],[2,7],[3,0],[4,0]...].
Cum pot converti un Obiect la o Serie de perechi cheie-valoare în JavaScript?
Puteți utiliza Obiect.tastele()
și map()
pentru a face acest lucru
var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
var result = Object.keys(obj).map(function(key) {
return [Number(key), obj[key]];
});
console.log(result);
Cel mai bun mod este de a face:
var obj ={"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
Object.entries(obj);
De asteptare "fișe", așa cum se arată aici, va reveni [cheie, valoare]
pe perechi, ca asker-a solicitat.
Alternativ, ai putea numi Obiect.valori(obj)`, care ar reveni doar valorile.
Obiect.intrări()
returnează o matrice ale cărei elemente sunt matrice corespunzătoare enumerable proprietatea[cheie, valoare]
perechi de găsit direct la "obiect". La comanda de proprietăți este aceeași ca și cea dată de looping peste valorile de proprietate a obiectului manual.
`Obiectul.intrări funcția returnează aproape exact ieșire're cer, cu excepția cheile sunt siruri de caractere în loc de numere.
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
console.log(Object.entries(obj));
Dacă ai nevoie de chei pentru a fi numere, ai putea hartă rezultatul la o noua serie cu o funcție de apel invers, care înlocuiește cheia de la fiecare pereche cu un număr constrâns de ea.
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
const toNumericPairs = input => {
const entries = Object.entries(input);
return entries.map(entry => Object.assign(entry, { 0: +entry[0] }));
}
console.log(toNumericPairs(obj));
Eu folosesc o săgeată funcție și Obiect.atribui pentru harta de apel invers în exemplul de mai sus, astfel încât să pot păstra într-una de instruire prin folosirea faptul că acest Obiect.atribui` returnează obiectul fiind atribuite, și o singură instrucțiune săgeată funcția's valoare de retur este rezultatul instrucțiunii.
Acest lucru este echivalent cu:
entry => {
entry[0] = +entry[0];
return entry;
}
După cum sa menționat de @TravisClarke în comentarii, în funcție de hartă pot fi reduse la:
entry => [ +entry[0], entry[1] ]
Cu toate acestea, care ar crea o nouă gamă pentru fiecare pereche de chei-valoare, în loc de a modifica cele existente matrice în loc, prin urmare, dublarea cantității de pereche de chei-valoare tablouri create. În timp ce inițial intrări matrice este încă accesibil, și intrările sale, nu va fi de gunoi colectate.
Acum, chiar dacă cu ajutorul nostru, în loc de metoda folosește încă două tablouri care dețin perechi cheie-valoare (de intrare și de ieșire matrice), numărul total de tablouri schimbă numai de unul. Intrare și de ieșire matrice sunt't de fapt pline cu tablouri, ci mai degrabă referințe la tablouri și aceste trimiteri ia o cantitate neglijabilă de spațiu în memorie.
Ai putea merge un pas mai departe și de a elimina creștere cu totul prin modificarea intrări matrice în loc de în loc de cartografierea la o nouă matrice:
const obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
const toNumericPairs = input => {
const entries = Object.entries(obj);
entries.forEach(entry => entry[0] = +entry[0]);
return entries;
}
console.log(toNumericPairs(obj));
Pentru a recapitula unele dintre aceste răspunsuri acum în 2018, în cazul în care ES6 este standard.
Incepand cu obiectul:
let const={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.values(obj));
//[9,8,7,6,5,4,3,2,1,0,5]
const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.entries(obj));
//[["1",9],["2",8],["3",7],["4",6],["5",5],["6",4],["7",3],["8",2],["9",1],["10",0],["12",5]]
const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.entries(obj).map(([k,v])=>[+k,v]));
//[[1,9],[2,8],[3,7],[4,6],[5,5],[6,4],[7,3],[8,2],[9,1],[10,0],[12,5]]
const obj={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
console.log(Object.entries(obj).reduce((ini,[k,v])=>(ini[k]=v,ini),[]));
//[undefined,9,8,7,6,5,4,3,2,1,0,undefined,5]
Această ultimă metodă, s-ar putea, de asemenea, reorganizarea matrice comandă în funcție de valoarea de chei. Uneori acest lucru ar putea fi comportamentul dorit (uneori don't). Dar avantajul este că acum valorile sunt indexate corect matrice slot, esențiale și banal să faci căutări pe ea.
În cele din urmă (nu face parte din întrebarea inițială, dar pentru exhaustivitate), dacă aveți nevoie să căutare ușor folosind tasta sau valoarea, dar nu't vreau tablouri rare, duplicate, și nu reordonare fără a fi nevoie pentru a converti la tastele numerice (chiar pot accesa foarte complex cheile), apoi matrice (sau obiect) nu este ceea ce ai nevoie. Eu va recomand "Harta" în loc:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
let r=new Map(Object.entries(obj));
r.get("4"); //6
r.has(8); //true
Utilizare Obiect.tastele
și Matrice#harta
metode.
var obj = {
"1": 5,
"2": 7,
"3": 0,
"4": 0,
"5": 0,
"6": 0,
"7": 0,
"8": 0,
"9": 0,
"10": 0,
"11": 0,
"12": 0
};
// get all object property names
var res = Object.keys(obj)
// iterate over them and generate the array
.map(function(k) {
// generate the array element
return [+k, obj[k]];
});
console.log(res);
Utilizarea Object.entries
pentru fiecare element al Obiectului în cheie & valoarea` format, apoi hartă prin ele astfel:
var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
var res = Object.entries(obj).map(([k, v]) => ([Number(k), v]));
console.log(res);
Dar, dacă sunteți sigur că cheile vor fi în ordine progresiva puteți utiliza Object.values
și Array#map
a face ceva de genul asta:
var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0};
// idx is the index, you can use any logic to increment it (starts from 0)
let result = Object.values(obj).map((e, idx) => ([++idx, e]));
console.log(result);
Cu lodash, în plus față de răspunsul oferit de mai sus, puteți avea, de asemenea, cheia în matricea de ieșire.
pentru:
const array = _.values(obj);
Dacă obj este următoarea:
{ “art”: { id: 1, title: “aaaa” }, “fiction”: { id: 22, title: “7777”} }
Apoi matrice va fi:
[ { id: 1, title: “aaaa” }, { id: 22, title: “7777” } ]
Dacă scrii în loc de ('gen' este un șir de caractere pe care le alegeți):
const array= _.map(obj, (val, id) => {
return { ...val, genre: key };
});
Vei primi:
[
{ id: 1, title: “aaaa” , genre: “art”},
{ id: 22, title: “7777”, genre: “fiction” }
]
ES6 (ES2015)punerea în aplicare folosind Set
Puteți folosi fie Matrice.din() sau Răspândirea sintaxa
Matrice.din() Exemplu
const names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];
const uniqueNames = Array.from(new Set(names));
console.log(uniqueNames);
Răspândirea sintaxa Exemplu
const names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];
const uniqueNames = [...new Set(names)];
console.log(uniqueNames);
Utilizare în
var obj = { "10":5, "2":7, "3":0, "4":0, "5":0, "6":0, "7":0,
"8":0, "9":0, "10":0, "11":0, "12":0 };
var objectToArray = function(obj) {
var _arr = [];
for (var key in obj) {
_arr.push([key, obj[key]]);
}
return _arr;
}
console.log(objectToArray(obj));
Putem schimba Numărul de tip Șir de Cheie ca de mai jos:
var obj = {"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
var result = Object.keys(obj).map(function(key) {
return [String(key), obj[key]];
});
console.log(result);
Recursiv converti obiect de matrice
function is_object(mixed_var) {
if (mixed_var instanceof Array) {
return false;
} else {
return (mixed_var !== null) && (typeof( mixed_var ) == 'object');
}
}
function objectToArray(obj) {
var array = [], tempObject;
for (var key in obj) {
tempObject = obj[key];
if (is_object(obj[key])) {
tempObject = objectToArray(obj[key]);
}
array[key] = tempObject;
}
return array;
}
puteți utiliza _.castArray(obj).
exemplu:
_.castArray({ 'un': 1 }); // => [{ 'un': 1 }]