这不是一个重复内容,请查看下面我的评论!
是否有比ES6中的for循环更高效的解决方案?
我写了以下代码,但性能不够好。有什么改进的建议吗?非常感谢。
基本上我有一个关于汽车的对象和一个有关用户喜好的数组。预期行为是将所有相关车名推入一个数组中。
用户可以给出任意数量的偏好。如果在偏好中提到了所有规格,则只应该推送一个汽车名称。因此,有些偏好将成为“剩菜”。
因此,在下面的例子中,Honda会出现,但BMW不会出现,这是预期的(但速度非常缓慢)行为。
// Car objects
const cars = [{
name: "Honda",
category: "eco",
specs: {
0: "green",
1: "fast",
2: "automatic"
}
},
{
name: "BMW",
category: "sport",
specs: {
0: "blue",
1: "fast",
2: "automatic"
}
}
]
// User preferences
const preferences = ["green", "fast", "4x4", "automatic", "panorama"]
// function to get length/amount of car specifications
function objsize(Myobj) {
var osize = 0,
key;
for (key in Myobj) {
if (Myobj.hasOwnProperty(key)) osize++;
}
return Object(osize);
};
//function to check if ALL specifications are included in the user preferences
function checkSpecs(spec_item) {
return preferences.includes(spec_item)
}
// main function
function filter_func() {
//final results
let matched_cars = []
for (i = 0; i < objsize(cars); i++) {
let specs_collector = []
for (j = 0; j < objsize(cars[i].specs); j++) {
specs_collector.push(cars[i].specs[j])
}
if (specs_collector.every(checkSpecs) === true) {
matched_cars.push(cars[i].name)
specs_collector = []
}
}
console.log(matched_cars)
}
filter_func()
objsize
是不必要且错误的。Object(osize)
创建了一个数字对象,这意味着5 === Object(5)
是false
。 要遍历数组,请使用for(var i = 0; i < array.length; i++)
或for (var item of arr)
或arr.forEach(function(item) {})
。 要遍历对象,请使用for (var prop in obj)
。 但是看起来cars[i].specs
应该是一个数组,而不是一个对象。 - Felix Kling