我的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)
如何优化此代码以避免嵌套循环或只是提高性能?
答案 0 :(得分: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 (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; }
答案 1 :(得分:1)
您可以遍历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);
答案 2 :(得分:1)
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]
答案 3 :(得分:1)
您可以使用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)
答案 4 :(得分:1)
只需将 @Override
public void onPageSelected(int position) {
currentPosition = position;
if (countDownTimer != null) {
countDownTimer.cancel(); // Most important thing
}
if (viewPager.getCurrentItem() == 0) {
videoPlayPause(0);
}
if (viewPager.getCurrentItem() == 1) {
videoPlayPause(5);
}
if (viewPager.getCurrentItem() == 2) {
videoPlayPause(9);
}
}
与三元运算符一起使用并扩展:
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)
答案 5 :(得分:1)
也许这样会有所帮助?
arr.forEach((user) => {
if (data[user.id] !== undefined) {
user.username = data[user.id]
}
});
答案 6 :(得分:1)
import threading
def change_color():
while True:
time.sleep(10)
color = (random.randint(0,255),random.randint(0,255),random.randint(0,255))
threading.Thread(target=change_color).start()