2015-11-18 3 views
1

Я хотел бы знать, есть ли способ избежать петли внутри петли, например:избегая контура внутри цикла

let underscore = require('underscore'); 

_.each(obj, (val, key) => { 
    _.each(key, (val, key) => { 
    _.each(key, (val, key) => { 
     // Finally i have access to the value that i need 
    }); 
    }); 
}); 

Я работаю с комплексом MAP объекта, которые имеют карты и массивы глубоко внутри , Очевидно, я не могу заменить петли .. но я хотел бы знать, могу ли я изменить свой код, чтобы сделать его более понятным.

Спасибо.

+4

да, есть способы. –

+1

@squint технически говоря, вы ответили на вопрос ... – Macmee

+2

@squint, есть * другие * способы слишком – Notaras

ответ

2

Да, вы можете разбить свой код намного более чистым способом, чем здесь, чтобы избежать вложенных циклов. Допустим, вы имели структуру, как это:

// lets invent some hash of people, where each person 
// has an array of friends which are also objects 
var people = { 
    david: { friends: [{name:'mary'}, {name:'bob'}, {name:'joe'}] }, 
    mary: { friends: [{name:'bob'}, {name:'joe'}] } 
}; 

function eatFriendBecauseImAZombie(myName, friendName) { 
    console.log(myName + ' just ate ' + friendName + '!!'); 
} 

// (inner loop 2) how to parse a friend 
function parseFriend(myName, friend) { 
    eatFriendBecauseImAZombie(myName, friend.name); 
} 

// (inner loop 1) how to parse a person 
function parsePerson(name, info) { 
    _.each(info.friends, (val) => parseFriend(name, val)); 
} 

// (outer loop) loop over people 
_.each(people, (val, key) => parsePerson(key, val)); 

результат:

david just ate mary!! 
david just ate bob!! 
david just ate joe!! 
mary just ate bob!! 
mary just ate joe!! 
Смежные вопросы