我有一个变量,它是一个数组,我希望默认情况下数组的每个元素都充当一个对象。要实现这一点,我可以在我的代码中执行类似的操作。
var sample = new Array();
sample[0] = new Object();
sample[1] = new Object();
这很好用,但我不想提及任何索引号。我希望我的数组的所有元素都是一个对象。我如何声明或初始化它?
var sample = new Array();
sample[] = new Object();
我尝试了上面的代码,但它不起作用。如何在不使用索引号的情况下初始化对象数组?
答案 0 :(得分:79)
使用array.push()
将项目添加到数组的末尾。
var sample = new Array();
sample.push(new Object());
要执行此操作n
次,请使用for
循环。
var n = 100;
var sample = new Array();
for (var i = 0; i < n; i++)
sample.push(new Object());
请注意,您也可以将new Array()
替换为[]
,将new Object()
替换为{}
,以便它变为:
var n = 100;
var sample = [];
for (var i = 0; i < n; i++)
sample.push({});
答案 1 :(得分:31)
根据声明的含义,您可以尝试在object literals中使用array literal:
var sample = [{}, {}, {} /*, ... */];
编辑:如果您的目标是默认情况下undefined
项为空对象文字的数组,则可以编写一个小实用程序函数:
function getDefaultObjectAt(array, index)
{
return array[index] = array[index] || {};
}
然后像这样使用它:
var sample = [];
var obj = getDefaultObjectAt(sample, 0); // {} returned and stored at index 0.
甚至:
getDefaultObjectAt(sample, 1).prop = "val"; // { prop: "val" } stored at index 1.
当然,直接指定getDefaultObjectAt()
的返回值是行不通的,所以你不能写:
getDefaultObjectAt(sample, 2) = { prop: "val" };
答案 2 :(得分:11)
在看到您在评论中的回复后。似乎最好像其他人所建议的那样使用push
。这样您就不需要知道索引,但仍然可以添加到数组中。
var arr = [];
function funcInJsFile() {
// Do Stuff
var obj = {x: 54, y: 10};
arr.push(obj);
}
在这种情况下,每次使用该函数时,它都会将一个新对象推入数组。
答案 3 :(得分:10)
您实际上并不需要创建空白Object
。你不能对它们做任何事情。只需根据需要将工作对象添加到样本中。像Daniel Imms建议的那样使用push
,并使用FrédéricHamidi建议的文字。你似乎想要像C一样编写Javascript。
var samples = []; /* If you have no data to put in yet. */
/* Later, probably in a callback method with computed data */
/* replacing the constants. */
samples.push(new Sample(1, 2, 3)); /* Assuming Sample is an object. */
/* or */
samples.push({id: 23, chemical: "NO2", ppm: 1.4}); /* Object literal. */
我相信使用new Array(10)
会创建一个包含10个undefined
元素的数组。
答案 4 :(得分:7)
您可以实例化一个&#34;对象类型的数组&#34;在这样的一行中(只需用您的对象替换 new Object()):
var elements = 1000;
var MyArray = Array.apply(null, Array(elements)).map(function () { return new Object(); });
答案 5 :(得分:5)
那么array.length
应该诀窍呢?类似的,我的意思是,如果你只是阅读它,你不需要知道索引范围..
var arrayContainingObjects = [];
for (var i = 0; i < arrayContainingYourItems.length; i++){
arrayContainingObjects.push {(property: arrayContainingYourItems[i])};
}
也许我没有正确理解您的问题,但您应该能够以这种方式获取数组的长度并将它们转换为对象。老实说,丹尼尔给出了同样的答案。你可以将你的数组长度保存到他的变量中,然后就可以了。
如果在我看来这不应该发生你不能得到你的数组长度。如你所说没有获得索引号,你可以这样做:
var arrayContainingObjects = [];
for (;;){
try{
arrayContainingObjects.push {(property: arrayContainingYourItems[i])};
}
}
catch(err){
break;
}
这是上述版本的不太好的版本,但循环将执行,直到你“跑出”索引范围。
答案 6 :(得分:5)
let arr = new Array(5).fill(null).map(v => new String('lol'));
将创建一个包含5个字符串对象的数组(不是字符串!)。然后你可以使用forEach作为例子。
arr.forEach(d => console.log(d.toString()));
在我看来,这个问题的答案毫无疑问是冗长的。所以我希望这对你们中的一些人有用。
答案 7 :(得分:3)
试试这个 -
var arr = [];
arr.push({});
答案 8 :(得分:3)
//making array of book object
var books = [];
var new_book = {id: "book1", name: "twilight", category: "Movies", price: 10};
books.push(new_book);
new_book = {id: "book2", name: "The_call", category: "Movies", price: 17};
books.push(new_book);
console.log(books[0].id);
console.log(books[0].name);
console.log(books[0].category);
console.log(books[0].price);
// also we have array of albums
var albums = []
var new_album = {id: "album1", name: "Ahla w Ahla", category: "Music", price: 15};
albums.push(new_album);
new_album = {id: "album2", name: "El-leila", category: "Music", price: 29};
albums.push(new_album);
//Now, content [0] contains all books & content[1] contains all albums
var content = [];
content.push(books);
content.push(albums);
var my_books = content[0];
var my_albums = content[1];
console.log(my_books[0].name);
console.log(my_books[1].name);
console.log(my_albums[0].name);
console.log(my_albums[1].name);
答案 9 :(得分:0)
使用array.push()将项添加到数组的末尾。
var sample = new Array();
sample.push(new Object());
你可以使用它
var x = 100;
var sample = [];
for(let i=0; i<x ;i++){
sample.push({})
OR
sample.push(new Object())
}
答案 10 :(得分:0)
使用forEach,我们可以存储数据,以防我们已经拥有数据,我们想要对数据进行一些业务登录。
var sample = new Array();
var x = 10;
var sample = [1,2,3,4,5,6,7,8,9];
var data = [];
sample.forEach(function(item){
data.push(item);
})
document.write(data);
使用简单的for循环
的示例var data = [];
for(var i = 0 ; i < 10 ; i++){
data.push(i);
}
document.write(data);
答案 11 :(得分:0)
如果希望数组中的所有元素都是对象,则可以在将对象插入数组之前使用JavaScript代理对它们进行验证。很简单,
const arr = new Proxy(new Array(), {
set(target, key, value) {
if ((value !== null && typeof value === 'object') || key === 'length') {
return Reflect.set(...arguments);
} else {
throw new Error('Only objects are allowed');
}
}
});
现在,如果您尝试执行以下操作:
arr[0] = 'Hello World'; // Error
它将引发错误。但是,如果您插入一个对象,将允许它:
arr[0] = {}; // Allowed
有关代理的更多详细信息,请参考以下链接: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy
如果您正在寻找实现polyfill的方法,则可以查看以下链接: https://github.com/GoogleChrome/proxy-polyfill
答案 12 :(得分:0)
我项目中的以下代码可能对您有用
reCalculateDetailSummary(updateMode: boolean) {
var summaryList: any = [];
var list: any;
if (updateMode) { list = this.state.pageParams.data.chargeDefinitionList }
else {
list = this.state.chargeDefinitionList;
}
list.forEach((item: any) => {
if (summaryList == null || summaryList.length == 0) {
var obj = {
chargeClassification: item.classfication,
totalChargeAmount: item.chargeAmount
};
summaryList.push(obj);
} else {
if (summaryList.find((x: any) => x.chargeClassification == item.classfication)) {
summaryList.find((x: any) => x.chargeClassification == item.classfication)
.totalChargeAmount += item.chargeAmount;
}
}
});
if (summaryList != null && summaryList.length != 0) {
summaryList.push({
chargeClassification: 'Total',
totalChargeAmount: summaryList.reduce((a: any, b: any) => a + b).totalChargeAmount
})
}
this.setState({ detailSummaryList: summaryList });
}
答案 13 :(得分:0)
const sample = [];
list.forEach(element => {
const item = {} as { name: string, description: string };
item.name= element.name;
item.description= element.description;
sample.push(item);
});
return sample;
任何人都可以尝试这个。.并提出一些建议。
答案 14 :(得分:-7)
var ArrayofObjects = [{}]; //An empty array of objects.