如何在数组中找到最后一个非空值的最佳方法?

3

我有一个函数,可以获取多维数组中第一个非空值。在我的示例中,第一个非空值是B,因为我首先按列遍历数组。

现在,在这个函数中,我还需要获取最后一个非空值。在我的示例中,“C”是最后一个非空值,因为“C”位于最远的列中。

那么...我如何在函数中获取C?

谢谢!

function findFirstAndLastValue (timeline) {
  for (var col = 0; col < timeline[0].length; col++) {
      for (var row = 0; row < 4; row++) {
        if (timeline[row][col] != '') {
          return [row, col];
        }
      }
    }
}

function getFirstAndLastValue() {
    var projectTl = [
      ['','','A','A','',''],
      ['','B','B','','',''],
      ['','','','','C',''],
      ['','','D','D','','']
    ] 

    var position = findFirstAndLastValue(projectTl);
    console.log(position)
}

getFirstAndLastValue();


2
为什么不尝试反转循环,从末尾开始。 - Jared
你不能在这里使用 return。最好你倒序运行。 - mplungjan
你的代码缺少几个分号。 - user47589
@mplungjan 我从未说过他们这样做了。 这被称为“做出观察”。 - user47589
显示剩余2条评论
4个回答

2
如果你想在JS中编写一行代码,可以这样做。

// For Single arrays | get last non empty value 
let your_array = ['','A','B','','C','', ''];
let last_non_empty_value = your_array.filter(item => item).pop(-1);
console.log(last_non_empty_value);

// for Getting Last Non Empty values only from multi-dimensional arrays
let a = [
    ['', '', 'A', 'E', '', ''],
    ['', 'B', 'C', '', '', ''],
    ['', '', '', '', 'D', ''],
    ['', '', 'F', 'G', '', '']
];
let last_values = a.map(item=>item.filter(item=>item).pop());
console.log(last_values);


2
使用与您现有代码完全相同的代码,但将其向后循环而不是向前循环,即可获得所需结果。您还可以 reverse 数组,或采取任何数量的“函数式”方法。

function findFirstAndLastValue (timeline) {
  for (var col = timeline[0].length; col--;) {
      for (var row = 4; row--;) {
        if (timeline[row][col] != '') {
          return [row, col];
        }
      }
    }
}

var projectTl = [
  ['','','A','A','',''],
  ['','B','B','','',''],
  ['','','','','C',''],
  ['','','D','D','','']
] 

  var position = findFirstAndLastValue(projectTl);
  console.log(position)


2
你可以使用reduce()方法,返回一个对象作为结果。

var projectTl = [
  ['', '', 'A', 'A', '', ''],
  ['', 'B', 'B', '', '', ''],
  ['', '', '', '', 'C', ''],
  ['', '', 'D', 'D', '', '']
]

const findInArr = data => {
  let temp = {
    first: null,
    last: null
  }
  return data.reduce((r, arr) => {
    arr.forEach(function(e, i) {
      if (e) {
        if (temp.last == null || i > temp.last) {
          temp.last = i
          r.last = e
        }
        if (temp.first == null || i < temp.first) {
          temp.first = i;
          r.first = e;
        }
      }
    })
    return r;
  }, Object.assign({}, temp))
}

console.log(findInArr(projectTl))


为什么要使用 Object.assign({}, temp) 而不是只用 temp?为什么要为 initialValue 创建一个新对象?好奇心 :-) - Ele
一个是用于索引,另一个是用于值,它们都是通过引用传递的,因此我们需要创建浅拷贝。 - Nenad Vracar
我知道这一点,我的关注点是创建一个新对象时调用Object.assign({}, temp)而不仅仅将temp作为initialValue传递。 - Ele

0

你需要从最后一个索引循环你的列:

for (var col = timeline[0].length - 1; col > 0; col--)

function findFirstAndLastValue(timeline) {
 var result = {
 "first": [],
 "last": []
 };
  first: for (var col = 0; col < timeline[0].length; col++) {
    for (var row = 0; row < 4; row++) {
      if (timeline[row][col] != '') {
         result.first = [row, col];
         break first;
      }
    }
  }
  
  last: for (var col = timeline[0].length - 1; col > 0; col--) {
    for (var row = 0; row < 4; row++) {
      if (timeline[row][col] != '') {
        result.last = [row, col];
        break last;
      }
    }
  }
  
  return result;
}

function getFirstAndLastValue() {

  var projectTl = [
    ['', '', 'A', 'A', '', ''],
    ['', 'B', 'B', '', '', ''],
    ['', '', '', '', 'C', ''],
    ['', '', 'D', 'D', '', '']
  ]

  var position = findFirstAndLastValue(projectTl);
  console.log(position);
}

getFirstAndLastValue();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接