【问题标题】:How to create an array of object literals in a loop?如何在循环中创建对象文字数组?
【发布时间】:2010-11-20 09:07:56
【问题描述】:

我需要像这样创建一个对象字面量数组:

var myColumnDefs = [
    {key:"label", sortable:true, resizeable:true},
    {key:"notes", sortable:true,resizeable:true},......

在这样的循环中:

for (var i = 0; i < oFullResponse.results.length; i++) {
    console.log(oFullResponse.results[i].label);
}

数组的每个元素中key 的值应该是results[i].label

【问题讨论】:

    标签: javascript arrays object-literal


    【解决方案1】:
    var arr = [];
    var len = oFullResponse.results.length;
    for (var i = 0; i < len; i++) {
        arr.push({
            key: oFullResponse.results[i].label,
            sortable: true,
            resizeable: true
        });
    }
    

    【讨论】:

    • 您可以跳过var obj = { 位,只需推送文字本身。
    • 只计算一次长度可能是个好主意,我选择添加一个var obj 使代码更清晰,当然你可以跳过它,如果你可以将整个脚本写在一行中希望:)
    • @kangax,长度不是“计算的”,它是一个 O(1) 操作。
    • @Triptych - 是的,但它是您在每次迭代时执行的属性查找,它不是免费的,可以避免。微优化?可能。此外,它是一个“实时”值 - 如果您在循环中修改数组,则长度将在连续迭代中发生变化,这可能导致无穷大。给这个手表youtube.com/watch?v=mHtdZgou0qU
    • 是的,但您不会在每次迭代时都修改数组。如果是这样,在大多数情况下,无论如何都要比较长度是荒谬的。
    【解决方案2】:

    RaYell 的回答很好 - 它回答了您的问题。

    在我看来,您确实应该创建一个以标签为键的对象,并将子对象作为值:

    var columns = {};
    for (var i = 0; i < oFullResponse.results.length; i++) {
        var key = oFullResponse.results[i].label;
        columns[key] = {
            sortable: true,
            resizeable: true
        };
    }
    
    // Now you can access column info like this. 
    columns['notes'].resizeable;
    

    上述方法应该比在整个对象数组中搜索每次访问的键要快得多,也更习惯。

    【讨论】:

    • +1 作为关键解决方案,更有意义并帮助我满足我的需求:)
    • 设置 var 键后好像少了一个分号?
    • 不错的答案,一直在寻找如何访问信息,谢谢
    • 如果键需要不止一次怎么办! ['notes'] 可以多次出现,那我们该怎么办?
    • Milson - 在这种情况下,它并不是真正的“钥匙”
    【解决方案3】:

    你可以在 ES6 中做类似的事情。

    new Array(10).fill().map((e,i) => {
       return {idx: i}
    });
    

    【讨论】:

      【解决方案4】:

      这是Array#map所擅长的

      var arr = oFullResponse.results.map(obj => ({
          key: obj.label,
          sortable: true,
          resizeable: true
      }))
      

      【讨论】:

        【解决方案5】:

        这将起作用:

         var myColumnDefs = new Object();
         for (var i = 0; i < oFullResponse.results.length; i++) {
             myColumnDefs[i] = ({key:oFullResponse.results[i].label, sortable:true, resizeable:true});
          }
        

        【讨论】:

          【解决方案6】:

          与 Nick Riggs 的想法相同,但我创建了一个构造函数,并使用它在数组中推送一个新对象。它避免了类键的重复:

          var arr = [];
          var columnDefs = function(key, sortable, resizeable){
              this.key = key; 
              this.sortable = sortable; 
              this.resizeable = resizeable;
              };
          
          for (var i = 0; i < len; i++) {
              arr.push((new columnDefs(oFullResponse.results[i].label,true,true)));
          }
          

          【讨论】:

            【解决方案7】:

            我会创建数组,然后将对象文字附加到它。

            var myColumnDefs = [];
            
            for ( var i=0 ; i < oFullResponse.results.length; i++) {
            
                console.log(oFullResponse.results[i].label);
                myColumnDefs[myColumnDefs.length] = {key:oFullResponse.results[i].label, sortable:true, resizeable:true};
            }
            

            【讨论】:

              【解决方案8】:
              var myColumnDefs = new Array();
              
              for (var i = 0; i < oFullResponse.results.length; i++) {
                  myColumnDefs.push({key:oFullResponse.results[i].label, sortable:true, resizeable:true});
              }
              

              【讨论】:

              【解决方案9】:

              如果你想在 ES6 中比 @tetra 更进一步,你可以使用 Object spread syntax 并执行以下操作:

              const john = {
                  firstName: "John",
                  lastName: "Doe",
              };
              
              const people = new Array(10).fill().map((e, i) => {(...john, id: i});
              

              【讨论】:

                猜你喜欢
                • 2012-01-27
                • 2018-11-23
                • 1970-01-01
                • 2021-08-17
                • 1970-01-01
                • 2022-08-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多