javascript(ES6):任何比;对于循环“;?

javascript(ES6):任何比;对于循环“;?,javascript,reactjs,for-loop,react-native,Javascript,Reactjs,For Loop,React Native,这不是重复的。请看我下面的评论 有人知道比ES6中的循环更有效的解决方案吗 我写了以下内容,缺乏表现力。有什么改进意见吗?非常感谢 基本上,我有一个关于汽车的对象和一个关于用户偏好的数组。预期的行为是将所有相关的汽车名称推送到一个数组中 用户可以提供任意数量的首选项。如果首选项中提到了所有规格,则只能推送汽车名称。因此,一些偏好将是“剩菜” 由于这个原因,在下面的例子中出现了本田,但没有宝马,这是预期的(但非常缓慢的行为) //汽车对象 常数车=[{ 名称:“本田”, 类别:“生态”, 规格:

这不是重复的。请看我下面的评论

有人知道比ES6中的循环更有效的解决方案吗

我写了以下内容,缺乏表现力。有什么改进意见吗?非常感谢

基本上,我有一个关于汽车的对象和一个关于用户偏好的数组。预期的行为是将所有相关的汽车名称推送到一个数组中

用户可以提供任意数量的首选项。如果首选项中提到了所有规格,则只能推送汽车名称。因此,一些偏好将是“剩菜”

由于这个原因,在下面的例子中出现了本田,但没有宝马,这是预期的(但非常缓慢的行为)

//汽车对象
常数车=[{
名称:“本田”,
类别:“生态”,
规格:{
0:“绿色”,
1:“快”,
2:“自动”
}
},
{
名称:“宝马”,
类别:“运动”,
规格:{
0:“蓝色”,
1:“快”,
2:“自动”
}
}
]
//用户偏好
常量首选项=[“绿色”、“快速”、“4x4”、“自动”、“全景”]
//获取车辆规格长度/数量的函数
函数objsize(Myobj){
var osize=0,
钥匙
for(输入Myobj){
if(Myobj.hasOwnProperty(key))osize++;
}
返回对象(osize);
};
//用于检查用户首选项中是否包含所有规格的函数
功能检查规格(规格项目){
返回首选项。包括(规格项目)
}
//主要功能
函数过滤器_func(){
//最终结果
让匹配的车=[]
对于(i=0;ifilter_func()
您无法真正避免查看每辆车,也无法避免查看车内的每一个规格,因为您要测试每一个规格。您可以通过使用

因此,这可能更快,也可能不会更快,但它更简单,更容易理解,因为代码读起来几乎像英语:过滤汽车,其中每个规格都在首选项中:

//汽车对象
常数车=[{
名称:“本田”,
类别:“生态”,
规格:[“绿色”、“快速”、“自动”]
},
{
名称:“宝马”,
类别:“运动”,
规格:[“蓝色”、“快速”、“自动”]
}
]
常量首选项=新设置([“绿色”、“快速”、“4x4”、“自动”、“全景”])
让filtered=cars.filter(car=>car.specs.every(spec=>preferences.has(spec)))
console.log(已过滤)
--编辑--

使用OP中的数据:

const数组_intersect=(a,b)=>a.filter(i=>(b.indexOf(i)>=0))
常数a_包含_b=(a,b)=>数组_相交(a,b)。长度==b.length
var cars=[{
名称:“本田”,
类别:“生态”,
规格:[“绿色”、“快速”、“自动”]
},
{
名称:“宝马”,
类别:“运动”,
规格:[“蓝色”、“快速”、“自动”]
}
]
常量首选项=[“绿色”、“快速”、“4x4”、“自动”、“全景”]
let filtered=cars.filter(car=>a\u包含b(首选项、car.specs))

console.log(过滤)至少无法跳出一个循环。你总是要在所有的车上绕圈子,无论是为了。。。或者使用另一个构造,如array.filter()。但还有另一种方法可以提高绩效。您可以使用位掩码。这需要更改car对象的数据结构,以便每个car已经包含与其规格对应的位掩码,并且当用户选择所需规格时,同样应添加规格代码。 (然而,我怀疑这可能会带来太多的麻烦而得不到什么好处。)

//假设有相应的预设二进制数字
//对于每个可用首选项:
//
//“蓝色”=>1
//“绿色”=>2
//“红色”=>4
//“快”=>8
//“慢”=>16
//“自动”=>32
//“4x4”=>64
//“全景”=>128
//
//在处理之前,您可以将其编码到数据中
var cars=[{
名称:“本田”,
类别:“生态”,
规格:[“绿色”、“快速”、“自动”],
bin_规格:42//2+8+32
},
{
名称:“宝马”,
类别:“运动”,
规格:[“蓝色”、“快速”、“自动”],
bin_规格:41//1+8+32
}
]
常量首选项=[“绿色”、“快速”、“4x4”、“自动”、“全景”]
const bin_首选项=234//2+8+64+32+128]
让已过滤=cars.filter(car=>(car.bin\u规格和bin\u首选项)==car.bin\u规格)

console.log(过滤)可能重复的@HereticMonkey请删除“可能重复的标签”。最初的标题是关于stackoverflow的另一个问题。我正在寻找一种比循环更有效的方法。建议的解决方案使用for循环。“我已经编写了以下缺少性能的内容。”性能如何?你是怎么测量的?每当您有一个需要处理的集合值时,必须使用某种循环来处理每个值,无论是显式的还是隐式的。FWIW,
objsize
是不必要的,也是错误的
Object(osize)
创建一个数字对象,这意味着
5===Object(5)
false
。要迭代数组,请使用
for(var i=0;i
for(arr的var项)
arr.forEach(函数(项){})
)。要在对象上迭代,请使用
for(obj中的var prop)
。但是它看起来像汽车[i]。规格实际上应该是一个数组,而不是一个对象。“理想的解决方案是没有任何设计上慢的“for循环”。“它们不是设计上慢的”。你怎么会这么想<代码>for
循环在浏览器中进行了大量优化。当然,循环可能不是问题的“最佳”解决方案,但这是另一个问题