【问题标题】: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)
如何优化此代码以避免嵌套循环或简单地提高性能?
【问题讨论】:
标签:
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.map 和ternary。
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; }