【问题标题】:How do I add an empty array to an object array?如何将空数组添加到对象数组?
【发布时间】:2015-06-05 18:09:34
【问题描述】:

基本上我有一个从中提取数据的数组。我想向其中添加一个新数组,以便提取更多数据。

var myArray.libraries = []

通过这样的 for 循环获取添加的项目:

for(var x=0; x < items.length; x++){
    myArray.libraries ({ name: items(x).name, state: items(x).state});
}

效果很好,我可以从myArray.libraries .name 得到我需要的东西。我需要添加诸如“书籍”之类的内容,以便每个条目都可以拥有它的书籍列表。可能有 1 本书或更多本书。

要清楚我正在使用角度,所以我使用类似这样的东西来为每个库输出:

<div ng-repeat="library in libraries">
    <p>{{library.name}}</p>
</div>

我只需要添加books,这样我就可以循环浏览该图书馆中的每一本书:

<div ng-repeat="book in libraries.books">
    <p>{{book.name}}</p>
</div>

我尝试使用myArray.libraries.books = [],但这并没有将收集添加到每个库中。我也尝试了myArray.libraries.push({ books: { } }),但这没有任何影响,并给了我一个错误,我无法推送到myArray.libraries.books,因为书籍不存在。

编辑

这里有一些示例代码。我用的是angular,但原理应该是一样的:

$scope.libraries= [];

//start loop to get the installations
for (var x = 0; x < res.rows.length; x++) {
    $scope.libraries.push({ ... , books: []});

    //run a new query to get the additional libraries info
    var booksQuery = query to get books;
    //run query to get results and loop through them
        for (var i = 0;i < res2.rows.length; i++) {
            $scope.libraries[x].books.push({ name: res2.rows.item(i).prodName });
        }
    });
}

编辑

我进行了一些测试,结果发现当我进行第二次数据库调用时,它不知道原来的 $scope 存在。

【问题讨论】:

  • 你的数组应该在 $scope 内
  • 我不确定我明白了,你有一个数组,但是你把它当作一个对象来添加命名键,所以它不再是一个数组。循环似乎没有做任何事情,它只是在每次迭代时覆盖相同的属性,现在你想向数组添加另一个命名键,它不再是一个真正的数组了?
  • @Fals - 是的,我只是在简化它

标签: javascript arrays angularjs


【解决方案1】:

尝试如下:

for(var x=0; x < items.length; x++){
    myArray.libraries ({ name: items(x).name, state: items(x).state, books: []});
}

这应该可以解决问题。

【讨论】:

  • 我真的很困惑,myArray.libraries 是数组、对象还是函数?
  • 根据您发布的代码,它似乎是一个数组,其中包含对象。我刚刚为您推送命名书籍的对象添加了另一个键,这是一个空数组,正如您的问题所述您想要做的那样。
  • 现在我更糊涂了,我不是OP?
  • 我的错 :) 没有意识到你在哪里 OP
  • @taxicala - 我的问题不是@adeneo 的。另外,您建议将books 放在数组中,但我无法推送。当我做myArray.libraries.books.push({...}) 时,我被告知Unable to get property 'push' of undefined or null reference
【解决方案2】:

基本上问题是您试图将数组推送到数组。您可以将另一个数组推送到您的 libraries,但要访问书籍,您必须使用索引来访问特定项目,例如 myArray.libraries[0].books[0]

所以我假设您必须将 myArray.libraries.push({ books: { } }) 更改为 myArray.libraries.push({ books: [] })

【讨论】:

    【解决方案3】:

    我为你创建了一个 plunker。请参考

    http://plnkr.co/edit/0FKg2fbe4CY11Oz6aSBF?p=preview

    $scope.libraries = {
        books : [
      {"name" : "book1"},
      {"name" : "book2"},
      {"name" : "book3"}
          ]
    
    
      };
    

    【讨论】:

    • 感谢您的支持,这就是我想要的结果。我试图弄清楚如何在我的数组中创建一个空的books,以便我可以通过循环将新项目推送到它。
    • @dcp3450 - 检查我的答案。
    • @dcp3450 - 有帮助吗?
    • 当我尝试它只是将books 添加到myArray 而不是myArray.libraries 并将每本书放在数组中而不是对它们进行分组......
    • 我无法收集,能否请您发送更新后的代码?
    【解决方案4】:

    这将对您有所帮助。

    数据库调用是异步的,因此第二个数据库调用不应处于循环中。请检查这是否有效

    $scope.libraries = [];  
    
      init();
    
      function init() {
        // do the first db transaction
      }
    
      // transaction1 callback
      function trans1Callback(result) {    
        addBooks(result);
      }
    
      var i = 0;
    
      function addBooks(result) {
          // to stop iteration at the end of records
          if (i >= result.rows.length) {
            return;
          }
          var item = result.rows.item(i);
          var data = {name: item.name, state: item.state, books: []};
          // do the second db transaction
    
          // transaction2 callback
          function trans2Callback(result2) {
    
              for (var j =0; j < result2.rows.length; j++) {
                  var book = result.rows.item(j);
                  data.books.push({ name: book.prodName });
              }
              // push to scope libraries
              $scope.libraries.push(data);
              // do increment
              i++;
              // Call addBooks again to process next record
              addBooks(result);
          }
    
      }
    

    【讨论】:

    • 添加了一些代码,以便您可以看到更多信息,这也包括一些角度的东西。不想让我的数据库调用超载样本
    • 我已经编辑了我的答案。请让我知道,如果它解决了你的问题
    猜你喜欢
    • 2015-03-16
    • 2015-09-03
    • 2021-06-02
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多