【问题标题】:Declaring array of objects声明对象数组
【发布时间】:2013-03-22 11:14:22
【问题描述】:

我有一个变量,它是一个数组,我希望数组的每个元素默认都充当一个对象。为此,我可以在我的代码中执行类似的操作。

var sample = new Array();
sample[0] = new Object();
sample[1] = new Object();

这很好用,但我不想提及任何索引号。我希望我的数组的所有元素都是一个对象。如何声明或初始化它?

var sample = new Array();
sample[] = new Object();

我尝试了上面的代码,但它不起作用。如何在不使用索引号的情况下初始化对象数组?

【问题讨论】:

  • 那么你是不是想把所有的数组项都设为默认对象?
  • @Jeff Yupp,你是对的..
  • 我没有看到这样做的意义。也许了解您为什么要这样做可以帮助我们了解如何实际解决您的问题。
  • 对象中有什么?听起来在函数内部实现array.push(objYouWant ) 肯定是解决方案。这样每次函数运行时,它都会添加一个具有您想要的任何属性的新对象。
  • 我不明白让它们自动成为对象会对您的情况有所帮助。

标签: javascript arrays object declare


【解决方案1】:

使用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({});

【讨论】:

    【解决方案2】:

    根据您的意思声明,您可以尝试在array literal 中使用object literals

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

    【讨论】:

    • @PrasathK,你的意思是你正在动态地填充你的数组(例如通过循环)?那么你应该按照丹尼尔的回答并使用push()
    • @PrasathK,反对票不是我的。如果我理解正确,Jeff Shaver 在您的问题下的评论是对的吗?
    【解决方案3】:

    您可以使用fill()

    let arr = new Array(5).fill('lol');
    
    let arr2 = new Array(5).fill({ test: 'a' });
    // or if you want different objects
    let arr3 = new Array(5).fill().map((_, i) => ({ id: i }));
    

    将创建一个包含 5 个项目的数组。然后你可以使用 forEach 来举例。

    arr.forEach(str => console.log(str));
    

    请注意,在执行new Array(5) 时,它只是一个长度为 5 的对象,并且数组为空。当你使用fill() 时,你可以用你想要的任何东西填充每个单独的位置。

    【讨论】:

    • 我恰好在您发布后在首页看到了它。它引起了我的注意,因为这是一个古老的问题,却有了新的答案。
    • 与其他答案相比,我认为这是一个难以使用和理解的问题。
    【解决方案4】:

    在看到您在 cmets 中的反应之后。正如其他人所建议的那样,似乎最好使用push。这样你就不需要知道索引,但你仍然可以添加到数组中。

    var arr = [];
    function funcInJsFile() {
        // Do Stuff
        var obj = {x: 54, y: 10};
        arr.push(obj);
    }
    

    在这种情况下,每次使用该函数时,它都会将一个新对象推送到数组中。

    【讨论】:

    • 天哪 .. 我在这些对象中有 100 多个变量,对于每个对象或函数调用,我必须在函数开始时为一些变量初始化一些值
    【解决方案5】:

    你真的不需要创建空白的Objects。你不能对他们做任何事。只需根据需要将您的工作对象添加到示例中。按照 Daniel Imms 的建议使用 push,并按照 Frédéric Hamidi 的建议使用文字。你似乎想像 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 元素的数组。

    【讨论】:

      【解决方案6】:

      您可以像这样在一行中实例化一个“对象类型”数组(只需将 new Object() 替换为您的对象):

      var elements = 1000;
      var MyArray = Array.apply(null, Array(elements)).map(function () { return new Object(); });
      

      【讨论】:

      • 如果我不知道元素的价值怎么办?
      【解决方案7】:

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

      它是上述版本的不太好的版本,但循环会一直执行,直到您“运行”出索引范围为止。

      【讨论】:

        【解决方案8】:
        //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); 
        

        这个例子对我有用。 Snapshot for the Output on Browser Console

        【讨论】:

          【解决方案9】:

          试试这个-

          var arr = [];
          arr.push({});
          

          【讨论】:

          • 这使得只有一个元素成为一个对象。我希望我的所有元素都是一个对象
          • @ShuklaSannidhya 这篇文章没有解释它的作用以及你为什么推荐它。 ...只是说。
          【解决方案10】:
          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;
          

          任何人都可以尝试这个......并提出一些建议。

          【讨论】:

          • 如果我错了请纠正我...但是 JS 不支持类型断言表达式...所以这个解决方案只适用于 TS
          【解决方案11】:

          使用 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())
          }    
          

          【讨论】:

            【解决方案12】:

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

            【讨论】:

              【解决方案13】:

              如果您希望数组中的所有元素都是对象,您可以使用 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

              【讨论】:

                【解决方案14】:

                我项目中的以下代码可能对你有好处

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

                【讨论】:

                  【解决方案15】:
                  var ArrayofObjects = [{}]; //An empty array of objects.
                  

                  【讨论】:

                  • 没有。这是 one 对象的非空数组。
                  • 欢迎来到 Stack Overflow!虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
                  猜你喜欢
                  • 1970-01-01
                  • 2023-04-06
                  • 1970-01-01
                  • 2017-01-17
                  • 2018-04-18
                  • 1970-01-01
                  • 2019-12-02
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多