JavaScript'te bir Anahtar Değer çiftinin {} Nesnesini Array [] biçimine dönüştürme


243

Böyle bir nesneyi dönüştürmek istiyorum:

{"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}

şöyle bir anahtar / değer çifti dizisine:

[[1,5],[2,7],[3,0],[4,0]...].

Bir Nesneyi JavaScript'te anahtar / değer çifti dizisine nasıl dönüştürebilirim?

Yanıtlar:


429

Bunu yapmak için Object.keys()ve kullanabilirsinizmap()

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);


6
@blvckasvp Anahtarlarınız olarak sayı mı kullanıyorsunuz? Değilse, anahtarınızı bir sayıya dönüştürmeye çalıştığında, başarısız olur ve NaNbunun yerine geri döner . Dizeleri anahtarlarınız olarak kullanmak isterseniz , yanıtını olarak [Number(key), obj[key]]değiştirin [key, obj[key]]veya Object.entriesyanıtlarında önerilen @Pila'yı kullanın
scottbot95

123

En iyi yol:

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);

entriesBurada gösterildiği gibi çağırmak , [key, value]askerlerin istediği gibi çiftleri döndürecektir .

Alternatif olarak, Object.values(obj)yalnızca değer döndürecek şekilde çağrı yapabilirsiniz .


6
Değerli geliştiricilerimiz, sadece birkaç dakika önce yayınlanan tarayıcılarla uyumlu olan bu güzel işlevleri benimsemeden önce lütfen ECMA uyumluluk tablosunu kontrol edin.
andreszs

8
@andreszs Bkz. Kullanabilir miyim tablo, IE desteğini bırakmayı umursamıyorsanız (ve 2019'da, gerçekten akıl sağlığınız için umarım) o zaman gitmek için oldukça iyisinizdir. FF 47, Haziran 2016'dan ve Chrome 54, aynı yılın Ekim ayından 14 Ağustos. Tam olarak dakikalar önce değil.
Kyll

FYI: Object.entries [anahtar, değer] döndürecek, ancak anahtar bir dize olacak, değer farklı olacaktır.
SHAHBAZ

62

Object.entries()öğeleri [key, value]doğrudan üzerinde bulunan numaralandırılabilir özellik çiftlerine karşılık gelen diziler olan bir dizi döndürür object. Özelliklerin sırası, nesnenin özellik değerleri üzerinde el ile döngü yapılarak verilenle aynıdır.

- https://developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/Global_Objects/Object/entries#Tanım

Object.entriesİşlevini verir neredeyse tuşları dışında size soran birileri tam çıkış numaralar yerine dizelerdir.

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));

Anahtarların sayı olması gerekiyorsa, sonucu, her çiftteki anahtarı ondan zorlanan bir sayıyla değiştiren geri arama işleviyle yeni bir diziye eşleyebilirsiniz.

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));

Bir ok işlevi kullanın ve Object.assignyukarıdaki örnekte harita geri çağırma Object.assigniçin, atanan nesneyi döndüren gerçeği kullanarak tek bir komutta tutabilirim ve tek bir komut ok işlevinin dönüş değeri komutun sonucudur.

Bu şuna eşittir:

entry => {
    entry[0] = +entry[0];
    return entry;
}

Yorumlarda @TravisClarke tarafından belirtildiği gibi, harita işlevi şu şekilde kısaltılabilir:

entry => [ +entry[0], entry[1] ]

Ancak bu, varolan diziyi yerinde değiştirmek yerine her bir anahtar / değer çifti için yeni bir dizi oluşturacak ve dolayısıyla oluşturulan anahtar / değer çifti dizilerinin sayısını iki katına çıkaracaktır. Orijinal giriş dizisine hala erişilebilir olsa da, bu dizi ve girdileri çöp toplanmaz.

Şimdi, yerinde yöntemimizi kullanmak, anahtar / değer çiftlerini (giriş ve çıkış dizileri) tutan iki dizi kullanıyor olsa da, toplam dizi sayısı yalnızca bir tane değişir. Girdi ve çıktı dizileri aslında dizilerle dolu değildir, aksine dizilere yapılan göndermeler ve bu başvurular bellekte önemsiz bir alan kaplar.

  • Her bir anahtar / değer çiftinin yerinde değiştirilmesi, ihmal edilebilir miktarda bellek büyümesine neden olur, ancak birkaç karakter daha yazmayı gerektirir.
  • Her bir anahtar / değer çifti için yeni bir dizi oluşturmak, gereken bellek miktarını iki katına çıkarır, ancak birkaç daha az karakter girilmesini gerektirir.

Bir adım daha ileri gidebilir ve girişler dizisini yeni bir diziye eşlemek yerine yerinde değiştirerek büyümeyi tamamen ortadan kaldırabilirsiniz:

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));


1
İşlevsel yaklaşımı seviyorum. Daha kısa bir alternatif olarak:Object.entries(obj).map(e => [+e[0], e[1]]);
Travis Clarke

21

Bu cevapların bazılarını şimdi ES6'nın standart olduğu 2018'de özetlemek için.

Nesneden başlayarak:

let const={"1":9,"2":8,"3":7,"4":6,"5":5,"6":4,"7":3,"8":2,"9":1,"10":0,"12":5};
  • Sadece bir dizideki değerleri körü körüne almak, anahtarlara dikkat etmeyin:

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]

  • Basit bir dizi çiftleri almak:

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]]

  • Önceki ile aynı, ancak her çiftte sayısal tuşlar var:

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]]

  • Yeni bir dizi için object özelliğini anahtar olarak kullanma (seyrek diziler oluşturabilir):

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]

Bu son yöntem, anahtarların değerine bağlı olarak dizi sırasını da yeniden düzenleyebilir. Bazen bu istenen davranış olabilir (bazen değil). Ancak şimdi avantaj, değerlerin doğru dizi yuvasında indekslenmesidir, bunlar üzerinde arama yapmak için gerekli ve önemsizdir.

  • Array yerine harita

Son olarak (orijinal sorunun bir parçası değil, tamlık için), anahtarı veya değeri kullanarak kolay arama yapmanız gerekiyorsa, ancak sayısal dizilere dönüşmek istemiyorsanız, yinelenen ve yeniden sıralama yapmak istemiyorsanız ( hatta çok karmaşık anahtarlara erişebilir), o zaman dizi (veya nesne) ihtiyacınız olan şey değildir. Bunun Mapyerine tavsiye eder :

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

2
Dördüncü madde işareti ve sonrası soru ile tamamen ilgisizdir ve cevabınızın geri kalanı sadece ilk üç cevabı burada özetlemektedir. Bu cevap, burada olmayan veya tamamen alakasız olan tartışmaya hiçbir şey getirmiyor.

Evet, ilk satır durumu olarak, bu cevapların bir özeti, daha sonra tam darbe işlevleri yerine modern ES6 tekniklerini kullanacak şekilde güncelleyin. Dördüncü cevap, JSON dizilerini ilişkilendirilebilir dizileri (ör. PHP) destekleyen bir dilden taşırken yararlıdır.
CarlosH.

Burada sağlanan tüm yöntemler zaten ilk üç cevaptan ikisinde sade bir şekilde verilmiştir, fonksiyonlarda değildir, bu yüzden orada ne olduğunuzu bilmiyorum. Dördüncü kadarıyla, dediğim gibi, sorulan soru ile tamamen alakasız. Farklı bir soru ile ilgili olabilir, ama bu değil. Ne olursa olsun, JSON, PHP, JavaScript veya Haskell kullanılarak oluşturulmuş olsun JSON'dur.

18

Yine Object.entriessizin için işe yaramazsa başka bir çözüm .

const obj = {
      '1': 29,
      '2': 42
    };
const arr = Array.from(Object.keys(obj), k=>[`${k}`, obj[k]]);
console.log(arr);


1
Bu benim için çalıştı. JSON eklenen dizinleri içe aktarmanın Angulars ngFor döngüsünü kullanmayı imkansız hale getiren bir sorunla karşılaştım. Bu yapı korunurken endeksleri çıkardı.
RAC

@RAC +1, "dizinler" yerine "dizinler" kullanmak için. Argo, arkaik (yani keyfi ve anlamsızca sapkın) İngiliz gelenekleri!
Venryx

12

Ecmascript 6'da,

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);

console.log(res);

Vaktini boşa harcamak


Bunun neden reddedildiğinden emin değilim, mükemmel çalıştı
sMyles

1
Oy vermedim, ancak .map((value)=>(value))bölümün anlamsız olduğunu unutmayın - sadece Object.entries(obj)çağrıdan elde edilene tam olarak eşdeğer bir giriş dizisi döndürür .
Venryx

8

Kullanım Object.keysve Array#mapyöntemler.

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);


7

Object.entriesNesnenin her bir unsurunu key & valueformatta almak için kullanın , ardından mapbunlar aracılığıyla şöyle:

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);

Ancak, anahtarların aşamalı sırada olacağından eminseniz kullanabilirsiniz Object.valuesve Array#mapböyle bir şey yapabilirsiniz:

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);



5

Lodash ile, yukarıda verilen cevaba ek olarak, anahtarı çıkış dizisinde de bulabilirsiniz.

Çıkış dizisindeki nesne anahtarları olmadan

için:

const array = _.values(obj);

Obj şuysa:

{ art”: { id: 1,  title: aaaa }, fiction”: { id: 22,  title: 7777”} }

Sonra dizi olacak:

[ { id: 1, title: aaaa }, { id: 22, title: 7777 } ]

Çıkış dizisindeki nesne tuşları ile

Bunun yerine yazarsanız ('tür' seçtiğiniz bir dizedir):

const array= _.map(obj, (val, id) => {
    return { ...val, genre: key };
  });

Alacaksın:

[ 
  { id: 1, title: aaaa , genre: art”}, 
  { id: 22, title: 7777”, genre: fiction }
]

4

Kullanmak için bu en basit çözümü öneririm Object.entries()

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.entries(obj)

console.log(result);


1

Object.values([])Şunu kullanabilirsiniz , henüz yapmadıysanız bu çoklu doldurmaya ihtiyacınız olabilir:

const objectToValuesPolyfill = (object) => {
  return Object.keys(object).map(key => object[key]);
};
Object.values = Object.values || objectToValuesPolyfill;

https://stackoverflow.com/a/54822153/846348

Sonra sadece şunları yapabilirsiniz:

var object = {1: 'hello', 2: 'world'};
var array = Object.values(object);

Js'deki dizilerin yalnızca sayısal anahtarlar kullanabileceğini unutmayın, bu nedenle nesnede başka bir şey kullanırsanız, bunlar `` 0,1,2 ... x`` olur.

Örneğin benzersiz bir anahtarınız varsa kopyaları kaldırmak yararlı olabilir.

var obj = {};
object[uniqueKey] = '...';

0

Şunun için kullanı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));

0

Yinelemeli nesneyi diziye dönüştürme

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;
}

0

Key için Number dize türünü aşağıdaki gibi değiştirebiliriz:

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);


0

Bu benim çözümüm, aynı sorunum var ve bu çözüm benim için çalışıyor gibi görünüyor.

yourObj = [].concat(yourObj);

0

Bu benim basit barebone uygulaması:

let 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 objectToArray = obj => {
      let sol = [];
      for (key in obj) {
        sol.push([key, obj[key]]);
      }
      return sol;
    };

objectToArray(obj)

0

Basit çözüm

'

var result = Object.keys(records).map(function (value) {
         return { [value]: records[value] };
});
console.log(result);


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.