Bir diziye nesne nasıl eklenir


317

Bir diziye nasıl nesne ekleyebilirim (javascript veya jquery'de)? Örneğin, bu kodla ilgili sorun nedir?

function(){
    var a = new array();
    var b = new object();
    a[0]=b;
}

Bu kodu, işlev1 dizisindeki birçok nesneyi kaydetmek ve dizideki nesneyi kullanmak için işlev2'yi çağırmak için kullanmak istiyorum.

  1. Bir nesneyi bir diziye nasıl kaydedebilirim?
  2. Bir nesneyi bir diziye nasıl koyabilir ve bir değişkene nasıl kaydedebilirim?

12
Düzenleme 5'in yaptığı gibi, lütfen gönderilen koddaki hataları düzeltmeyin. Sorudaki basit bir hatayı düzeltirseniz, genellikle cevabın var olması için bir neden yoktur.
Paul

Ayrıca, pushburada zaten birçok kez önerilmiştir. Lütfen, bu konuyu artık başka bir pushöneri ile kirletmeyin .
Boghyon Hoffmann

Yanıtlar:


631

Array.push () öğesini kullanarak diziye bir şey koyun.

var a=[], b={};
a.push(b);    
// a[0] === b;

Diziler hakkında ek bilgi

Tek seferde birden fazla öğe ekleyin

var x = ['a'];
x.push('b', 'c');
// x = ['a', 'b', 'c']

Dizinin başına öğe ekleme

var x = ['c', 'd'];
x.unshift('a', 'b');
// x = ['a', 'b', 'c', 'd']

Bir dizinin içeriğini diğerine ekleme

var x = ['a', 'b', 'c'];
var y = ['d', 'e', 'f'];
x.push.apply(x, y);
// x = ['a', 'b', 'c', 'd', 'e', 'f']
// y = ['d', 'e', 'f']  (remains unchanged)

İki dizinin içeriğinden yeni bir dizi oluşturma

var x = ['a', 'b', 'c'];
var y = ['d', 'e', 'f'];
var z = x.concat(y);
// x = ['a', 'b', 'c']  (remains unchanged)
// y = ['d', 'e', 'f']  (remains unchanged)
// z = ['a', 'b', 'c', 'd', 'e', 'f']

Ayrıca bir sorum var: myArray = []; myArray.push ({'text': 'bazı metin', 'id': 13}); ve şimdi myArray boş. Öyleyse, myArray [0] ['text'] 'den değeri almaya çalışırsak boş olur, neden? take.ms/jSvbn
fdrv

Bir şey doğru görünmüyor. Kapsam belirleme sorunu olmadığından emin olun. MyArray öğesini bildirmek için let / var komutunu kullanın. Çünkü myArray.push her zaman myArray öğesini değiştirir.
John Strickler

58
var years = [];
for (i= 2015;i<=2030;i=i+1)
{
years.push({operator : i})
}

Burada dizi yılları aşağıdaki gibi değerlere sahip

years[0]={operator:2015}
years[1]={operator:2016}

böyle devam ediyor.


55

Her şeyden önce, objectya hiç yoktur array. Orada Objectve Array. İkincisi, bunu yapabilirsiniz :

a = new Array();
b = new Object();
a[0] = b;

Şimdi tek elemanı aolan bir dizi olacak b.


4
En az karmaşık cevap için +1. Aşağıda OP'nin 2. sorusuna bir cevap eklemek için genişlettim.
Sam

30

ES6Notasyonu kullanarak , böyle bir şey yapabilirsiniz:

Eklemek için forma operatörünü şu şekilde kullanabilirsiniz :

var arr1 = [1,2,3]
var obj = 4
var newData = [...arr1, obj] // [1,2,3,4]
console.log(newData);


20
  • JavaScript büyük / küçük harfe duyarlıdır . Arama new array()ve var olmadığı için new object()bir atar ReferenceError.
  • Hataya eğilimli davranışınew Array() nedeniyle kaçınmak daha iyidir . Bunun yerine, yeni diziyi atayın . Nesneler için kullanın .
    = [val1, val2, val_n]= {}
  • Bir diziyi genişletmenin birçok yolu vardır (John'un cevabında gösterildiği gibi ), ancak en güvenli yol concatyerine kullanmaktır push. concatorijinal diziye dokunulmadan yeni bir dizi döndürür. özellikle dizi genel olarak tanımlanmışsa kaçınılması gerekenpush çağıran diziyi değiştirir .
  • İstenmeyen mutasyonlardan kaçınmak için nesneyi ve yeni diziyi dondurmak da iyi bir uygulamadır . Dondurulmuş bir nesne ne değişebilir ne de genişletilebilir (sığ).

Bu noktaları uygulamak ve iki sorunuzu cevaplamak için, aşağıdaki gibi bir işlev tanımlayabilirsiniz:

function appendObjTo(thatArray, newObj) {
  const frozenObj = Object.freeze(newObj);
  return Object.freeze(thatArray.concat(frozenObj));
}

Kullanımı:

// Given
const myArray = ["A", "B"];
// "save it to a variable"
const newArray = appendObjTo(myArray, {hello: "world!"});
// returns: ["A", "B", {hello: "world!"}]. myArray did not change.

2
"Kullanım" bunu benim tercih ettiğim cevaptı.
HPWD

@boghyon, donma ve mutasyonları merak ediyorum. Doğrudan concat yöntemi nedeniyle veya bir '.concat ()' işlemi sırasında dizide başka bir yerden dizide yapılabilecek değişiklikler nedeniyle dizideki değişikliklerden mi bahsediyorsunuz? İkincisi, asenkron kod durumunda bile, en azından teorik olarak, yöntem tamamlanana kadar iade edilmemesi gerektiğinden, javascript'in tek iş parçacıklı olması nedeniyle bu otomatik olarak engellenmemelidir?
jdmayfield

@jdmayfield: JS'nin değerlendirme stratejisi, nesne paylaşımının çağrısıdır . Nesneler aktarıldığında kopyalanmazlar. Bu nesnelerdeki mutasyonlar, aktarılırken , mutatörün eşzamansız olarak çağrılıp çağrılmadığına, tamamlanıp tamamlanmadığına bakılmaksızın arayanlar tarafından her zaman anında görülebilir. Bu tür yan etkiler sıklıkla hatalara yol açtığından, orijinal nesneden ayrılmış yeni bir nesne döndürüyoruz. Nesneleri değişmez hale getirmek (örn. Yoluyla freeze), istenmeyen mutasyonları önlemek için sadece ek bir adımdır.
Boghyon Hoffmann

@jdmayfield: Tahmin edebileceğiniz gibi, her seferinde yeni nesneler oluşturmak, nesneler büyüdüğünde hızlı bir şekilde verimsiz hale gelebilir. Bu gibi durumlarda, Mori (tür ölü) ve Immutable.js gibi kalıcı veri yapılarından yararlanarak verimli hale getiren yardımcı kütüphaneler vardır . İşte "neden değişmezliğe" kısa bir giriş: youtu.be/e-5obm1G_FY
Boghyon Hoffmann

9

Gabi Purcaru'nun cevabını 2 numaraya bir cevap içerecek şekilde genişletmek.

a = new Array();
b = new Object();
a[0] = b;

var c = a[0]; // c is now the object we inserted into a...

8

/* array literal */
var aData = [];

/* object constructur */
function Data(firstname, lastname) {
  this.firstname = firstname;
  this.lastname = lastname;
  this.fullname = function() {
    return (this.firstname + " " + this.lastname);
  };
}

/* store object into array */
aData[aData.length] = new Data("Java", "Script"); // aData[0]

aData.push(new Data("Jhon", "Doe"));
aData.push(new Data("Anna", "Smith"));
aData.push(new Data("Black", "Pearl"));

aData[aData.length] = new Data("stack", "overflow"); // aData[4]

/* loop arrray */
for (var x in aData) {
  alert(aData[x].fullname());
}

/* convert array of object into string json */
var jsonString = JSON.stringify(aData);
document.write(jsonString);


7

obejctaçıkça bir yazım hatasıdır. Ancak her iki objectve arrayihtiyaç büyük harfler.

İçin kısa eller kullanabilirsiniz new Arrayve new Objectbunlar []ve{}

Öğesini kullanarak diziye veri aktarabilirsiniz .push. Bu onu dizinin sonuna ekler. veya verileri içerecek bir dizin ayarlayabilirsiniz.

function saveToArray() {
    var o = {};
    o.foo = 42;
    var arr = [];
    arr.push(o);
    return arr;
}

function other() {
    var arr = saveToArray();
    alert(arr[0]);
}

other();

5

Alternatif cevap ise budur.

böyle bir diziniz varsa: var contacts = [bob, mary];

ve bu diziye başka bir dizi koymak isterseniz, bunu şu şekilde yapabilirsiniz:

İşlev yapıcısını bildirme

function add (firstName,lastName,email,phoneNumber) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
this.phoneNumber = phoneNumber;
}

nesneyi işlevden yapın:

var add1 = new add("Alba","Fas","Des@gmail.com","[098] 654365364");

ve nesneyi diziye ekleyin:

contacts[contacts.length] = add1;

3
a=[];
a.push(['b','c','d','e','f']);

6
Merhaba, SO'ya hoş geldiniz. Lütfen kodu sadece cevap olarak atmayın. Kullanıcıların neler olduğunu daha iyi anlayabilmeleri için düşüncelerinizi açıklayın. Teşekkürler.
Cthulhu

2

Otomatik liste ile nesne oluşturucu yaptığım yol:

var list = [];

function saveToArray(x) {
    list.push(x);
};

function newObject () {
    saveToArray(this);
};

0

Kodunuzu bu şekilde kullanırsanız bir kapsam sorunu ile karşılaşıyorsunuz. Aralarında kullanmayı planlıyorsanız (veya çağırıyorsa, parametre olarak iletin) işlevlerin dışında bildirmeniz gerekir.

var a = new Array();
var b = new Object();

function first() {
a.push(b);
// Alternatively, a[a.length] = b
// both methods work fine
}

function second() {
var c = a[0];
}

// code
first();
// more code
second();
// even more code
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.