【问题标题】:Optimise nested for loop and if statement in javascript优化javascript中的嵌套for循环和if语句
【发布时间】:2019-08-23 10:20:24
【问题描述】:

我的 javascript 代码中的两个嵌套 for 循环中有一个 if 语句,如下所示。

问题是当我必须比较数组中的数千个对象时,执行速度会变慢,因为循环遍历整个数组只是为了检查单个匹配值。

当数据对象中的键与 arr 数组中的对象的 id 匹配时,它会将用户名键添加到 arr 数组中的对象。

请运行以下代码并查看输出:

var data = { 1: 'John',
  2: 'Josehp',
  8: 'Marley',
  3: 'George',
  4: 'Stella',
  5: 'Stanley',
  123: 'Juhi'
}



var arr = [ { id: '1'
   },
  { id: '2'
  },
  { id: '10'
    },
  { id: '3'
    },
  { id: '4'
    },
  { id: '13'
    },
  { id: '5'
    }
];

var x;
for (x in data) {
	for (i = 0; i < arr.length; i++) {
	if (arr[i].id == x) {
	arr[i].username = data[x];
	}
     }
  }
console.log(arr)

如何优化此代码以避免嵌套循环或简单地提高性能?

【问题讨论】:

  • if loop?你是说 if 语句吗?
  • 已更正。谢谢

标签: javascript arrays node.js loops object


【解决方案1】:
var data = { 1: 'John', 2: 'Josehp', 8: 'Marley', 3: 'George', 4: 'Stella', 5: 'Stanley', 123: 'Juhi' },
array = [ { id: '1' }, { id: '2' }, { id: '10' }, { id: '3' }, { id: '4' }, { id: '13' }, { id: '5' }],
i;

for (var m in array){
 array[m].username = data[array[m].id]
}

console.log(array);

【讨论】:

    【解决方案2】:

    您可以循环遍历arr 数组并根据data 的属性使用相同的键设置每个项目的用户名。

    var data = {
      1: 'John',
      2: 'Josehp',
      8: 'Marley',
      3: 'George',
      4: 'Stella',
      5: 'Stanley',
      123: 'Juhi'
    };
    
    var arr = [{ id: '1' },
    { id: '2' },
    { id: '10' },
    { id: '3' },
    { id: '4' },
    { id: '13' },
    { id: '5' }];
    
    
    arr.forEach(function(item) {
      item.username = data[item.id];
    });
    console.log(arr);

    【讨论】:

      【解决方案3】:

      这样的事情会有所帮助吗?

      arr.forEach((user) => {
          if (data[user.id] !== undefined) {
              user.username = data[user.id]
          }
      });
      

      【讨论】:

      • 真的很喜欢这个简短的回答
      【解决方案4】:

      只需将map 与三元运算符一起使用并传播:

      var data = { 1: 'John', 2: 'Josehp', 8: 'Marley', 3: 'George', 4: 'Stella', 5: 'Stanley', 123: 'Juhi'}
      
      var arr = [{id: '1'},{id: '2'},{id: '10'},{id: '3'},{id: '4'},{id: '13'},{id: '5'}];
      
      arr = arr.map(e => data[e.id] ? { ...e, username: data[e.id] } : e);
      
      console.log(arr)
      .as-console-wrapper { max-height: 100% !important; top: auto; }

      【讨论】:

        【解决方案5】:

        您可以使用Array.prototype.mapternary

        var data = { 1: 'John',
          2: 'Josehp',
          8: 'Marley',
          3: 'George',
          4: 'Stella',
          5: 'Stanley',
          123: 'Juhi'
        }
        
        
        
        var arr = [ { id: '1'
           },
          { id: '2'
          },
          { id: '10'
            },
          { id: '3'
            },
          { id: '4'
            },
          { id: '13'
            },
          { id: '5'
            }
        ];
        
        let out = arr.map(({id}) => (data[id]? {id, username: data[id]}: {id}));
        console.log(out)

        【讨论】:

          【解决方案6】:

          data 是一个以id 为键的哈希,因此通过 id 访问它的元素是一个O(1) 操作。

          这意味着您可以通过 arr 变量进行单个循环,从而使您的算法线性化 (O(n)):

          for (let i = 0; i < arr.length; i++ )
            if ( data[arr[i].id] )
              arr[i].username = data[arr[i].id]
          

          【讨论】:

            【解决方案7】:

            您可以进行一个循环并检查对象是否存在并更新数组。

            var data = { 1: 'John', 2: 'Josehp', 8: 'Marley', 3: 'George', 4: 'Stella', 5: 'Stanley', 123: 'Juhi' },
                array = [ { id: '1' }, { id: '2' }, { id: '10' }, { id: '3' }, { id: '4' }, { id: '13' }, { id: '5' }],
                i;
            
            for (i = 0; i < array.length; i++) {
                if (array[i].id in data) {
                    array[i].username = data[array[i].id];
                }
            }
            
            console.log(array);
            .as-console-wrapper { max-height: 100% !important; top: 0; }

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-12-18
              相关资源
              最近更新 更多