Diziden nesne oluştur


91

Dizi listesinden nesne oluşturmak istiyorum. Dinamik bir dizim var ve şöyle görünmesi gerekiyor:

var dynamicArray = ["2007", "2008", "2009", "2010"];

ve bazı javascript es6 ile bunun gibi bir nesne yapmak istiyorum:

const obj = {
    2007: {
        x: width / 5,
        y: height / 2
    },
    2008: {
        x: (2 / 5) * width,
        y: height / 2
    },
    2009: {
        x: (3 / 5) * width,
        y: height / 2
    },
    2010: {
        x: (4 / 5) * width,
        y: height / 2
    }
}

iç nesneler hakkında endişelenme ama sadece böyle bir yapı yapmak istedim

 obj = {
      2007: ...,
      2008: ...,
      ...
    }

Lütfen yardım edin, teşekkürler.


2
Tamam. Ne denedin Nerede sıkıştın Ne araştırma yaptın? Baktığınız bu örneğin?
TJ Crowder

Yanıtlar:


217

Basitçe

 const obj = {};

 for (const key of yourArray) {
      obj[key] = whatever;
 }

veya "işlevsel" stili tercih ederseniz:

 const obj = yourArray.reduce((o, key) => Object.assign(o, {[key]: whatever}), {});

modern nesne yayma operatörünü kullanarak:

const obj = yourArray.reduce((o, key) => ({ ...o, [key]: whatever}), {})

Misal:

[
  { id: 10, color: "red" },
  { id: 20, color: "blue" },
  { id: 30, color: "green" }
].reduce((acc, cur) => ({ ...acc, [cur.color]: cur.id }), {})

Çıktı:

{red: 10, blue: 20, green: 30}

Şu şekilde çalışır:

reduceboş bir nesneyle başlatılır ( {}sonunda boştur ), bu nedenle ilk yineleme değişkenleri acc = {} cur = { id: 10, color: "red" }. İşlev bir nesne döndürür - bu nedenle işlev gövdesi parantez içine alınır => ({ ... }). Yayılma operatörü ilk yinelemede hiçbir şey yapmaz, bu nedenle red: 10ilk öğe olarak ayarlanır.

İkinci yinelemede değişkenler acc = { red: 10 } cur = { id: 20, color: "blue" }. Burada yayılma operatörü genişler acc ve fonksiyon geri döner { red: 10, blue: 20 }.

Üçüncü yineleme acc = { red: 10, blue: 20 } cur = { id: 30, color: "green" }, yani accnesnenin içine yayıldığında, fonksiyonumuz son değeri döndürür.


1
Teşekkürler! Gerektiği gibi çalıştı. array.reduceİşlevi hiç bilmiyordum .
Hussain Dehgamwala

1
İşlevsel stili tercih ederseniz ve ben tercih ederim, kullanmalısınız const. Aslında ne olursa olsun kullanmalısın. Ayrıca, ES Next rest / spread sözdizimine erişiminiz varsa (örneğin TypeScript veya Babel aracılığıyla) const obj = yourArray.reduce((o, key) => ({ ...o, [key]: whatever}), {})tohumu yazabilir ve hatta değiştirmekten kaçınabilirsiniz: p
Aluan Haddad

1
@AluanHaddad: iyi bir öneri, gönderiyi CW'ye dönüştürdü, düzenlemekten çekinmeyin.
georg

({... o, [anahtar]: candidateDoc [anahtar]}) .. burada candidateDoc biraz pojo'dur. Yalnızca candidateDoc'ta tanımlanan değerleri almak istiyorum. Ancak parantezlerle karıştırıldım, işe yarayacak bir 'getiri' veya if ifadesi alamıyorum. Beni doğru yöne yönlendirebilir misiniz - belgeleri okumaktan korkmayın.
2018

1
@cameck: teşekkürler, gönderi CW, düzenlemekten çekinmeyin.
georg

38

Object.fromEntriesECMAScript 2019'dan gelen yeni , bir dizideki değerleri aşağıdaki gibi bir nesnedeki anahtarlara dönüştürmeyi daha da kolaylaştırır.

const dynamicArray = ["2007", "2008", "2009", "2010"];
const obj = Object.fromEntries(
  dynamicArray.map(year => [year, {
    something: "based",
    on: year
  }])
)

console.log(obj)


21

js'de es6 ile dizi için küçültme işlevi şöyle yapıyorum

let x = [1,2,3]
let y = x.reduce((acc, elem) => {
  acc[elem] = elem // or what ever object you want inside
  return acc
}, {})
console.log(y) // {1:1, 2:2, 3:3}

3
daha da kısa:[1, 2, 3].reduce((x, y)=>(x[y] = 1, x), {})
exebook

5
var keys = ['key1', 'key2', 'key3']

var object = Object.assign({}, ...Object.entries({...keys}).map(([a,b]) => ({ [b]: 'someValue' })))
console.log(object)

Bu üretecek

{ key1: 'someValue', key2: 'someValue', key3: 'someValue' }

0

Aslında Object.assign()doğrudan yayılma operatörüyle kullanabileceğinizi öğrendim . Bir reduceveya mapişlevle daha fazla karmaşıklık getirmeye gerek yok .

Basitçe yapın Object.assign(...yourArray, {})ve istediğiniz sonucu alacaksınız. Bunun yerine, nesneler dizinizi başka bir nesneye birleştirmek istiyorsanız, o zaman da çağırabilirsiniz Object.assign(...yourArray, yourObject)ve bu da gayet iyi çalışacaktır.

Dizilerden biri nesneler içermese de yalnızca ilkel değerler içeriyor olsa bile, iki diziyi tek bir nesnede birleştirmek için de aynı yöntemi kullanabilirsiniz - ancak bunu yaparsanız, dizilerden en az birinin yalnızca nesneleri tuttuğundan emin olmanız gerekir. bir ilkel varsayılan olarak kendi dizinini kullanır key, böylece yinelenen bir anahtar varsa hata alırsınız.

Bununla birlikte, OP'lerin amacı için, en güvenli yol olan boş bir nesneyle birleştiği için bu tür hata riski yoktur.

const arr = [
  { a: 0 },
  { c: 1 },
  { e: 2 },
];

const obj = Object.assign(...arr, {});

console.log(obj)

// Results to:
// Object { a: 0, c: 1, e: 2 }

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.