javascript(ES6):比"for loops"更有效的方法吗?

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)

Mar*_*yer 9

您无法真正避免查看每辆车,并且您无法避免查看车内的每个规格,因为您想要测试每一辆车.您可以通过使用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)