2015-09-21 3 views
0

Было бы плохой практикой выполнять такой цикл? Я перебираю все машины и добавляю текст «новый» к имени каждого цвета. Каждый автомобиль может иметь несколько цветов.Вложенная петля - эта плохая практика

var cars = [ 
    { 
     company: "honda", 
     colors: [ 
      { 
       name="burntRed" 
      }, 
      { 
       name: "springGreen" 
      } 
     ] 
    }, 
    { 
     company: "ford", 
     colors: [ 
      { 
       name="burntOrange" 
      }, 
      { 
       name: "black" 
      } 
     ] 
    } 
]; 
     for (var c = 0; c < cars.length; p++) { 

      var car = cars[c]; 

      for (var i = 0; i < cars.colors.length; i++) { 
       car.color[i].name += 'new ' + car.color[i].name; 
      }; 
     }; 
+0

Я предполагаю, что 'cars.colors.length' должен был быть' car.colors.length'? –

+5

Плохая практика для записи объектов как '{name =" burntOrange "}'. Но петли прекрасны (по крайней мере, учитывая эту небольшую информацию) –

+0

Опечатки в сторону, если вы хотите прикоснуться к каждому автомобилю и каждому цвету внутри каждого автомобиля, тогда да, вам нужны две петли. В чем ваш вопрос? –

ответ

2

Поскольку структура данных, в которой вы выполняете итерирование, вложен, я не вижу другого (более совершенного) способа архивирования вашей задачи.
Вложенные итерации не обязательно являются плохими, даже многие известные алгоритмы полагаются на них. Но вы должны быть крайне осторожны в том, что вы выполняете в самом глубоком цикле, поскольку эти команды будут выполняться очень часто.

3

Вы можете подумать о другом стиле, который должен пересекать массивы. Javascript предлагает множество методов циклирования arrays.

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

Кстати, вложенные петли неизбежны.

var cars = [{ company: "honda", colors: [{ name: "burntRed" }, { name: "springGreen" }] }, { company: "ford", colors: [{ name: "burntOrange" }, { name: "black" }] }]; 
 

 
cars.forEach(function (car) { 
 
    car.colors.forEach(function (color) { 
 
     color.name = 'new ' + color.name; 
 
    }); 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(cars, 0, 4) + '</pre>');

+0

Да, наверное. Я хочу начать использовать материал ES6, возможно, – PositiveGuy

0

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

const appendStringToColor = (string) => (color) => ({ name: `${color.name} ${string}` }); 
const appendNewToColor = appendStringToColor('new'); 
const updateCarWithColor = (car) => ({ ...car, colors: car.colors.map(appendNewToColor) }); 

const updateCarsColors = (cars) => cars.map(updateCarWithColor); 
Смежные вопросы