如何减少此代码javascript代码,使其不重复?

时间:2015-01-17 11:33:15

标签: javascript arrays optimization recursion refactoring

我有一个函数遍历对象中的每个名字。此对象具有一个数组参数材料,用于保存其他对象。这些对象具有相同的数组参数,可以容纳更多对象,等等。

我的代码行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);
                    }
                }
                }
            }
        }
    }
}
};

1 个答案:

答案 0 :(得分:0)

使用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])
  

此方法还为数组的每个元素应用回调函数(同样,仅在此要求的上下文中,并且仅对现有项应用)。但它也会返回转换后的(映射的)数组。

     

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

     

签名非常类似于地图:

array.filter(callback,[ thisObject])
  

过滤器的回调函数应该返回布尔值(true或false)。 true表示过滤器已传递,false表示项目不应包含在结果集中。

<强>参考

相关问题