Javascript Pure For vs.ES6地图|选择哪一种?

Javascript Pure For vs.ES6地图|选择哪一种?,javascript,arrays,for-loop,Javascript,Arrays,For Loop,我喜欢用JavaScript编写纯Fornested Fors,而不是使用map,因为我知道它在性能上比map好。这是真的还是我一次又一次地犯错误 如果For更快,则贴图更清晰,但选择哪个更好 因为我不擅长ES6MAP,任何人都可以用更干净的方式用Map编写下面的代码吗 let categoriesDataArray = []; let productsDataArray = []; if (!this.props.categoriesIsFetching) { for (let i = 0

我喜欢用JavaScript编写纯Fornested Fors,而不是使用map,因为我知道它在性能上比map好。这是真的还是我一次又一次地犯错误

如果For更快,则贴图更清晰,但选择哪个更好

因为我不擅长ES6MAP,任何人都可以用更干净的方式用Map编写下面的代码吗

let categoriesDataArray = [];
let productsDataArray = [];
if (!this.props.categoriesIsFetching) {
  for (let i = 0; i < this.props.categories.length; i += 1) {
    for (let j = 0; j < this.props.products.length; j += 1) {
      if (
        this.props.categories[i]._id === this.props.products[j].category_id
      ) {
        productsDataArray.push(this.props.products[j]);
      }
    }
    categoriesDataArray.push({
      title: this.props.categories[i].title,
      data: productsDataArray
    });
    productsDataArray = [];
  }
}

es6映射更干净,可以避免不必要的范围错误/对象突变,在切换到es6后,不再用于和forEach,因为循环在大多数情况下确实更快。 你可以自己试试:

我的建议是:利用你能找到的所有优秀的JavaScript特性,并使用代码优化器(如Babel)和正确的插件,例如将代码编译成运行速度更快的代码

下面是另一个例子,说明使用一种循环方法与使用另一种循环方法相比会产生多大的差异:
所以,如果可以的话,使用优化器

绝对最佳的性能并不总是最大的问题。你真的关心每分钟运行一次的任务减少1-2毫秒吗?对我来说,可读性和避免bug更重要

如果For更快,则贴图更清晰,但选择哪个更好

始终保持清洁,直到遇到实际性能问题。然后调试性能问题的来源;不仅仅是盲目的重构和优化

但是您的代码比vs map有更大的性能问题。您使用嵌套循环的方法

您的代码必须迭代每个类别的所有产品

let categoriesDataArray = [];

if(!this.props.categoriesIsFetching){   
    categoriesDataArray = this.props.categories.map(category => {
        return {
            title: category.title,
            data: this.props.products.filter(product => product.category_id === category._id)
        }
    });
}
再说一次,有时候这没关系。它很简单,很有表现力。。。但随着阵列越来越大,其执行时间将迅速增加。 然后,使用不同的方法将比讨论循环或阵列映射更有益

通过在每个数组上迭代一次并使用映射,可以完成相同的任务。运行时为On+m而不是On*m

或作为循环:

let categoriesDataArray = [];

if(!this.props.categoriesIsFetching){
    const productsByCategoryId = {};

    for(let i=0; i<this.props.categories.length; ++i){
        let category = this.props.categories[i];
        let data = [];

        productsByCategoryId[category.__id] = data;
        categoriesDataArray[i] = {
            title: category.title,
            data: data
        }
    }

    for(let j=0; j<this.products.categories.length; ++j){
        let product = this.products.categories[j];

        if(product.category_id in productsByCategoryId){
            productsByCategoryId[product.category_id].push(product);
        }
    }
}

任何人都可以写下面的代码吗?这不是一个代码编写服务。你尝试一下,看看哪里失败了,然后问你为什么失败fail@JaromandaX:不要忘记两个步骤,然后再问你为什么彻底研究失败,并彻底搜索有点多余的内容,但是-请不要随意用黑体字写问题的部分内容,这只会影响可读性。另外,在提到方法时,由于case很重要,请使用正确的case映射,尤其是因为JavaScript也有map,这完全是另一回事。ES6 map表示数据结构,对吗?从ES5开始,可以使用数组.map方法,然后考虑更新问题。ES6MAP’明确地代表Map。数组映射就是映射,它与ES6无关——它是ES5。你问的是ES5的功能。当你不打算创建新阵列时,你肯定还是应该使用它。您甚至可以将其与块作用域的const声明一起使用。在本例中,他希望从现有数组创建一个新数组,在本例中,array.filter将完成此任务。别忘了问self:我每秒迭代10000个项目多少次21000次。我需要这样做吗?有时性能考虑因素不仅仅在于语法。P.S.同意你的建议-这是一个很好的插件!谢谢你,托马斯,我会考虑从现在开始使用清洁的方式。
let categoriesDataArray = [];

if(!this.props.categoriesIsFetching){
    const productsByCategoryId = {};

    for(let i=0; i<this.props.categories.length; ++i){
        let category = this.props.categories[i];
        let data = [];

        productsByCategoryId[category.__id] = data;
        categoriesDataArray[i] = {
            title: category.title,
            data: data
        }
    }

    for(let j=0; j<this.products.categories.length; ++j){
        let product = this.products.categories[j];

        if(product.category_id in productsByCategoryId){
            productsByCategoryId[product.category_id].push(product);
        }
    }
}