Javascript Map Array Last Item

后端 未结 7 680
滥情空心
滥情空心 2020-12-13 16:57

I have this:

map = ranks.map((row, r) => (
  row.map((rank, i) => {
    return [element(r, i, state, rank, toggled, onClick)];
  })
));
7条回答
  •  爱一瞬间的悲伤
    2020-12-13 17:50

    As LeoYuan 袁力皓 answered, this is the correct answer, but it can be a bit improved.
    map accepts a function with a third parameter, which is the iterated array itself.

    row.map((rank, i, arr) => {
        if (arr.length - 1 === i) {
            // last one
        } else {
            // not last one
        }
    });
    

    Using an arr.length instead of row.length is a better and correct approach for several reasons:

    1. When you mix scopes, it may lead for an unexpected bugs, especially in a poorly written or poorly designed code. In general, it is always a good way to avoid mixing between scopes when possible.
    2. When you like to provide an explicit array, it will work as well. E.g.

      [1,2,3,4].map((rank, i, arr) => {
          if (arr.length - 1 === i) {
              // last one
          } else {
              // not last one
          }
      });
      
    3. If you like to move the callback outside of the map scope (mainly for a better performance), it will be wrong to use row.length as it is out of scope. E.g. in the OP case:

      const mapElement = (rowIndex, state, toggled, onClick) => {
          return (rank, i, arr) => {
              let lastIndex = arr.length - 1;
              return [element(rowIndex, i, state, rank, toggled, onClick, lastIndex)];
          };
      };
      
      map = ranks.map((row, r) => row.map(mapElement(r, state, toggled, onClick)));
      

提交回复
热议问题