Umu*_*885 4 javascript for-loop reactjs react-native
这不是重复的.请看下面的评论!
有人知道比ES6中的循环更有效的解决方案吗?
我写了以下内容,但缺乏性能.任何改进的想法?非常感谢.
基本上我有一个关于汽车的对象和一个关于用户偏好的数组.预期的行为是将所有相关的汽车名称推送到一个数组中.
用户可以提供任何数量的偏好.如果首选项中提到了所有规格,则只应推送汽车名称.因此,一些偏好将是"剩饭".
出于这个原因,在下面的例子中,本田出现了,但不是宝马,这是预期的(但非常缓慢的行为).
// 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()Run Code Online (Sandbox Code Playgroud)
您无法真正避免查看每辆车,并且您无法避免查看车内的每个规格,因为您想要测试每一辆车.您可以通过使用Set避免每次循环首选项.
所以这可能会或可能不会更快,但它更简单,更容易理解,因为代码几乎读起来像英语:过滤汽车,其中每个规格都在首选项中:
// Car objects
const cars = [{
name: "Honda",
category: "eco",
specs: ["green", "fast","automatic"]
},
{
name: "BMW",
category: "sport",
specs: ["blue", "fast","automatic"]
}
]
const preferences = new Set(["green", "fast", "4x4", "automatic", "panorama"])
let filtered = cars.filter(car => car.specs.every(spec => preferences.has(spec)))
console.log(filtered)Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
202 次 |
| 最近记录: |