Javascript Map Array最后一项

时间:2016-07-04 02:56:35

标签: javascript arrays multidimensional-array

我有这个:

map = ranks.map((row, r) => (
  row.map((rank, i) => {
    return [element(r, i, state, rank, toggled, onClick)];
  })
));

它通过二维数组进行映射。 在每一行之后,我想插入<div class="clearfix"></div>

我认为,如果我能以某种方式获取每一行的最后一个索引,那么我将能够在行映射回调中使用它。有人可以告诉我该怎么做吗?

9 个答案:

答案 0 :(得分:59)

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

答案 1 :(得分:38)

正如LeoYuan 袁力皓所回答的那样,这是正确答案,但可以稍微改进一下 map接受带有第三个参数的函数,该参数是迭代数组本身。

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

使用arr.length代替row.length是一种更好,更正确的方法,原因如下:

  1. 当您混合使用范围时,可能会导致意外错误,尤其是在编写错误的代码中。一般来说,尽可能避免在范围之间混合是一种好方法。
  2. 当您想提供显式数组时,它也会起作用。 E.g。

    [1,2,3,4].map((rank, i, arr) => {
        if (arr.length - 1 === i) {
            // last one
        } else {
            // not last one
        }
    });
    
  3. 如果您想将回调移到map范围之外(主要是为了获得更好的性能),那么使用row.length是不对的,因为它超出了范围。例如。在OP情况下:

    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)));
    

答案 2 :(得分:3)

接受答案略有改善:

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

这将从循环内部删除算术。

答案 3 :(得分:2)

更少的代码行就可以达到相同的效果

row.map((rank, i, {length}) => (

  //last element
  if(i + 1 === length){ 

  }
));

答案 4 :(得分:1)

您可以用数组的长度检查最后一个索引。这是一个逻辑

var randomnumber = Math.floor(Math.random() * (100 - 10 + 1)) + 10

console.log("your last index is dynamic, ehich is ",randomnumber-1);
let arry = [];
for (i=1;i<randomnumber;i++){
    arry.push(i)
}

    arry.map((data,index)=>{
          if(index == arry.length-1 ){
            console.log("last index data  ",data)
          }
          else{
          console.log("remain data ",data)
          
          }

    })

    console.log("your last index is dynamic, which is ",randomnumber-1);
这也适用于动态arry更改。 这是我使用.. :-)

的一种过于简单的技术

答案 5 :(得分:1)

简化上面的答案

const array = ['apple','orange','banana'];

array.map((element, index) => (index === array.length - 1) ? \`${element}.\` : \`${element},\`);

答案 6 :(得分:0)

config.action_controller.include_all_helpers = false

将返回 =IF(ROUNDUP(N38/N37,0)>N17,ROUNDDown(N38/N37,0),RoundUp(N38/N37,0))

答案 7 :(得分:0)

一种更简单的方法是将.map与三元运算符结合使用,

const positions = ["first", "second", "third", "fourth"]

positions.map((x, index, array) => {
    index === array.length -1 
        ? console.log("this is the last item in the array")
         : console.log( x)
}

/////////////说明

x ###返回当前元素.map循环遍历

index ###返回当前元素的索引(项目在数组中的位置)。

array ###返回相同的元素,因此如果我们使用sth这样的话

 ["first", "second", "third", "fourth"].map...

我们仍将获得要遍历的数组

array.length-1 ###给出了数组的长度,-1给出了数组中最后一个元素的索引

请帮忙投票,如果需要更多说明,请发表评论

答案 8 :(得分:0)

访问 length 中的 array.map() 属性的最简洁的方法(虽然有点“脏”——你可能会得到一些 ESLint 错误,TypeScript 也可能对此不满意)是拉它(通过解构)第三个回调参数(这是我们正在映射的数组),然后分配一个新属性 e。 G。 lastIndex,哪个值是从之前提取的 length 中派生出来的:

let list = ["Alice", "Bob", "Cedrick", "David", "Emily"]

let mapped = list.map((item, i, {length, lastIndex = length - 1}) => {
  return i === lastIndex ? "lastitem: " + item : item
})

console.log(mapped)