我有两个嵌套的forEach循环,我尝试使用标准的forEach和一些自己的逻辑,但是失败了,比我尝试了使用以下代码从npm异步库:
function addValue(data, callback){
var final_data = [];
data.forEach(element => {
final_data.push(element);
});
var values =
[[1,0],
[2,0],
[3,0],
[-1,0],
[-2,0],
[-3,0],
[1,1],
[2,1],
[3,1],
[-1,1],
[-2,1],
[-3,1]];
async_.forEachOf(final_data, (item, {}, callback1) => {
values.forEach(value=>{
var obj = Object.assign({},item);
obj.x+=value[0];
obj.y+=value[1];
final_data.push(obj);
});
callback1();
}, err => {
if (err) console.error(err.message);
// Here i get different values for separate executions with same data
console.log(final_data.length)
});
}
我要实现的是final_data是对象数组,第一个forEachOf循环应遍历final_data对象,并且对于每个对象,都应运行第二个嵌套的forEach,以创建具有修改后值的新对象并将其推回在对象的final_data数组中。 我遇到的问题是该函数总是在不同的时间返回,因此final_data的长度始终是不同的,一旦推送了100个对象,一次是670个。因此,基本上应该在main函数中调用addValue回调一次所有对象都已处理,两个for循环完成...
使用非异步代码最终会陷入无限循环,很奇怪
function addValue(data, callback){
var final_data = [];
data.forEach(element => {
final_data.push(element);
});
var values =
[[1,0],
[2,0],
[3,0],
[-1,0],
[-2,0],
[-3,0],
[1,1],
[2,1],
[3,1],
[-1,1],
[-2,1],
[-3,1]];
for(var i=0; i<final_data.length; i++){
for(var j=0; j<values.length; j++){
var obj = Object.assign({},final_data[i]);
obj.x+=values[j][0];
obj.y+=values[j][1];
final_data.push(obj);
console.log(final_data.length)
}
}
}
编辑2:在没有异步的情况下使用forEach ...与forEach相比,无限标准循环的原因可能是什么?
答案 0 :(得分:1)
您可以在假设有es6支持的情况下尝试此操作
function addValue (data) {
var values =
[[1,0],
[2,0],
[3,0],
[-1,0],
[-2,0],
[-3,0],
[1,1],
[2,1],
[3,1],
[-1,1],
[-2,1],
[-3,1]];
var finalData = data.map((item)=>{
return values.map(function(value) {
var obj = Object.assign({},item);
obj.x+=value[0];
obj.y+=value[1];
return obj;
})
});
return finalData.flat(2);
}
答案 1 :(得分:0)
async function addValue(data, callback){
var final_data = [];
data.forEach(element => {
final_data.push(element);
});
var values =
[[1,0],
[2,0],
[3,0],
[-1,0],
[-2,0],
[-3,0],
[1,1],
[2,1],
[3,1],
[-1,1],
[-2,1],
[-3,1]];
var result =[]
for(item of final_data)
for (const value of values) {
var obj = Object.assign({},item);
obj.x+=value[0];
obj.y+=value[1];
await result.push(obj);
}