返回数组的每个子数组的最后一个非null元素

时间:2018-03-09 11:14:28

标签: javascript arrays

拥有像这样的二维数组

anArray = [[1, 2, 3], [null, 4, null, null], [1, 0, null, 5, null]];

我的目标是得到一个包含每个子数组的最后一个元素的新数组,但也是非空的。在这种情况下:[3, 4, 5]

获取我使用的每个元素的最后一个元素:

anArray.map(a => a.slice(-1)[0]); - 它获取每个子数组的最后一个元素。

要获取数组的最后一个非null元素,可以使用它:

_.findLast([1, null, 2, null], (el) => el !==null); 

它适用于一个简单的数组,但我不知道如何将它用于二维数组。有什么想法吗?

7 个答案:

答案 0 :(得分:1)

您可以结合使用Array#mapArray#filterArray#slice

.map()将通过您的初始数组

.filter()会过滤掉子数组中的null

.slice()将从每个已过滤的子数组中选择最后一个元素

var anArray = [[1, 2, 3], [null, 4, null, null], [1, 0, null, 5, null]];

var res = anArray.map(o => o.filter(n => n != null).slice(-1)[0]);

console.log(res);

答案 1 :(得分:1)

使用mapreduceRight(基于this

var anArray = [[1, 2, 3], [null, 4, null, null], [1, 0, null, 5, null]];
anArray.map( arr => arr.reduceRight( (a,c) => ( c != null && a == null ? c : a) , null))

答案 2 :(得分:1)

您可以使用concat扩展语法,然后使用mapfilter方法移除null

const anArray = [[1, 2, 3], [null, 4, null, null], [1, 0, null, 5, null]];

const result = [].concat(...anArray.map(e => e.filter(Boolean).slice(-1)))
console.log(result)

答案 3 :(得分:0)

除了_.findLast

之外,您还可以使用Array#map
anArray.map(a => _.findLast(a, el => el !== null));

工作示例:

let anArray = [
  [1, 2, 3],
  [null, 4, null, null],
  [1, 0, null, 5, null]
];

let result = anArray.map(a => _.findLast(a, el => el !== null));
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

答案 4 :(得分:0)

您可以尝试这样:

思想:

  • 使用map返回每个子数组的值。
  • 使用while循环向后并获得第一个非空值。

注意: while因为,大多数循环机制会遍历所有值。为了在第一场比赛中打破,并减少迭代次数,我更喜欢这个。

&#13;
&#13;
var anArray = [ [1, 2, 3], [null, 4, null, null], [1, 0, null, 5, null] ];
var result = anArray.map((subArray) => {
  var i = subArray.length - 1;
  while (i > 0) {
    if (subArray[i] !== null) {
      return subArray[i];
    }
    i--;
  }
})
console.log(result)
&#13;
&#13;
&#13;

答案 5 :(得分:0)

var anArray = [[1, 2, 3], [null, 4, null, null], [1, 0, null, 5, null]];
var anArray = anArray.map(function(arr){
    return findLastTruthyElement(arr);
});
console.log(anArray);
function findLastTruthyElement(arr){
    if(!Array.isArray(arr)){
        throw 'passed element is not array';
        return undefined;
    }
    arr = arr.filter(function(item){
        if(item) return true;
        else return false;
    });
    return arr[arr.length-1];
}

答案 6 :(得分:0)

您可以弹出最后一个元素进行映射。

var array = [[1, 2, 3], [null, 4, null, null], [1, 0, null, 5, null]];
    result = array.map(o => o.filter(n => n != null).pop());

console.log(result);