【问题标题】:How can I reduce this code javascript code so it's not as repetitve?如何减少此代码 javascript 代码使其不重复?
【发布时间】:2017-09-01 10:19:04
【问题描述】:

我有一个函数可以遍历对象中的每个名称。这个对象有一个数组参数 materials 保存其他对象。这些对象具有相同的数组参数,可以容纳更多的对象,依此类推。

我的代码行 3-5 只是在添加 .material 和另一个变量时重复。此外,代码只会进入对象名称的四层以下,否则我必须不断重复更多代码。

我怎样才能减少这种混乱?

var itemList = function(x) {
    console.log(x.materials[0].name);
for (var i = 1; i < x.materials.length; i++) {
    console.log(x.materials[i].name);
    if (x.materials[i].build !== "BasicFactory" && i !== 0) {
        for (var j = 1; j < x.materials[i].materials.length; j++) {
            console.log(x.materials[i].materials[j].name);
            if (x.materials[i].materials[j].build !== "BasicFactory" && j !== 0) {
                for (var k = 1; k < x.materials[i].materials[j].materials.length; k++) {
                console.log(x.materials[i].materials[j].materials[k].name);
                if (x.materials[i].materials[j].materials[k].build !== "BasicFactory" && j !== 0) {
                    for (var l = 1; l < x.materials[i].materials[j].materials[k].materials.length; l++) {
                    console.log(x.materials[i].materials[j].materials[k].materials[l].name);
                    }
                }
                }
            }
        }
    }
}
};

【问题讨论】:

  • 请改用Code Review 询问。
  • underscore.js 或 loadsh.js 非常适合这种情况。
  • 您想使用函数式函数,例如 mapforeach

标签: javascript arrays optimization recursion refactoring


【解决方案1】:

使用map 迭代并获取键/值对,使用filter 删除其他值:

function foo(value, index)
  {
  if (value.hasOwnProperty("name")) return value.name; else return null;
  }

function bar(value)
  {
  if (value) return value;
  }

var baz = 
[
    1,
    2,
    {name:[1,
           2,
           {name:[1,2,3]}
          ]
    }
].map(foo).filter(bar);

console.log(baz);

有时我们可能想要获取原始数组的转换或映射。 JavaScript 也为此提供了一个 HOF:map。这个函数有一个签名,如下:

array.map(callback,[ thisObject])

此方法还为数组的每个元素应用回调函数(同样,仅在 this 所需的上下文中,并且仅适用于现有项目)。但是,它也会返回转换后的(映射的)数组作为结果。

除了基本的映射结果,我们可能只想获取满足特定条件的某些条目,例如具有以“d”开头的电子邮件地址的条目。我们可以为这种目的创建一个过滤器,它将排除不符合我们条件的项目。可以使用过滤器方法快速轻松地完成此操作。

签名和map很像:

array.filter(callback,[ thisObject])

过滤器的回调函数应该返回布尔值(真或假)。 true 表示过滤通过,false 表示不应该包含在结果集中。

参考文献

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多