嵌套循环 - 这是不好的做法

时间:2015-09-21 17:02:01

标签: javascript node.js

执行这样的循环是不好的做法?我循环遍历所有汽车,并在每个颜色的名称上添加“新”文字。每辆车都有多种颜色。

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;
            };
        };

3 个答案:

答案 0 :(得分: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>');

答案 1 :(得分:2)

由于您迭代的数据结构是嵌套的,我没有看到另一种(更高性能)的方式来实现您的任务。
嵌套迭代不一定是坏事。甚至许多众所周知的算法依赖于它们。但是你必须非常小心你在最深的循环中执行什么,因为这些命令将经常执行。

答案 2 :(得分:1)

有点晚但嵌套循环通常很糟糕,因为它们难以测试和推理。我会采用更具声明性的方法:

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);