javascript:避免嵌套在嵌套循环中

时间:2016-09-19 16:12:27

标签: javascript

我无法绕过这段代码,而没有在嵌套循环中嵌套一些丑陋的东西。

我有以下内容:

var selected_ingredients = [ {name:'ing4},{name:'ing13},{name:'ing14},{name:'ing21},{name:'ing23} ];

var pizza = [ {name:'pizza1',ing[ {name:'ing12},{name:'ing2} ]}, {name:'pizza2',ing[ {name:'ing4},{name:'ing13} ]}, {name:'pizza3',ing[ {name:'ing14},{name:'ing21},{name:'ing2} ]}, {name:'pizza4',ing[ {name:'ing14},{name:'ing3} ]}, {name:'pizza5',ing[ {name:'ing21},{name:'ing14},{name:'ing5} ]} ];

我想要以下内容:

我希望代码只能打印出与selected_ingredients数组中相同成分的比萨饼。

当数组可以包含1000个披萨项时,如何在不使循环中的所有循环中的代码变慢的情况下执行此代码。

2 个答案:

答案 0 :(得分:0)

您可以使用地图(适用于现代浏览器)。

var map = new Map();
for (var i=0; i < pizza.length; i++) {
  var ingString = JSON.stringify(pizza[i].ing);
  var pizzaWithIng = map.get(ingString);
  if (!pizzaWithIng) {
    pizzaWithIng = [];
    map.set(ingString, pizzaWithIng);
  }
  pizzaWithIng.push(pizza[i]);
}

var result = map.get(JSON.stringify(selected_ingredients));

解决方案要求对成分进行分类。

答案 1 :(得分:-1)

您可以使用.filter()方法根据任何条件过滤数组。请看下面的示例代码。

var filtered_result = pizza.filter(function(pizza_detail){
  return pizza_detail.ing.sort(arraySort) == selected_ingredients.sort(arraySort);
})

function arraySort(a,b){
  return a.attributes.name < b.attributes.name ? 1 : -1;
}

由于您的Json对象未排序,因此您需要在将其与selected_ingrediants数组进行比较之前对其进行排序。