找出数组停在哪里的最佳方法

时间:2018-07-05 13:09:12

标签: javascript arrays

假设我有4种不同类型的随机数组,输入可以提供5种长度。

[0,4,4,0,0]
[1,2,3,4,0]
[2,4,6,4,5]
[3,6,0,8,9]

假设数组输入的长度始终为5,有什么好办法找出数字的结尾(变为0,之后没有数字)?

我应该得到一个像上面的数组一样的index值

2
3
4
4

我知道一种方法,但是它需要很多if和for语句,并且会减慢流程的速度。

谢谢。

8 个答案:

答案 0 :(得分:1)

如果数组的最后一个数字不是0,则可以使用简单的for循环和快速方式。

var arr = [1, 2, 3, 4, 0];

if(arr[arr.length -1] != 0)
{
  console.log(arr.length -1)
}
else
{
  for(var i = arr.length - 1; i >=0; i--)
  {
    if(arr[i] == 0 && i != 0 && arr[i -1] != 0)
    {
      console.log(i - 1);
      break;
    }
  }
}

答案 1 :(得分:0)

使用2进行循环,比较当前值,并使用当前数组的索引获取数组结束处的索引。

var arr = [
  [0,4,4,0,0],
  [1,2,3,4,0],
  [2,4,6,4,5],
  [3,6,0,8,9],
];
          
for (var i = 0, ilen = arr.length; i < ilen; i++) {
  for (var j = 0, jlen = arr[i].length; j < jlen; j++) {
    if (arr[i][j] === 0) {
      console.log('array ' + i + ' ends at index:', j);
      break;
    }
  }
}

答案 2 :(得分:0)

不是最佳答案,但是您可以将其映射并获得最终长度

.map(a=>a.map((b,i)=>a.slice(i+1).filter(c=>c!=0).length > 0 || b != 0).filter(b=>b).length - 1)

var x = [[0,4,4,0,0],
[1,2,3,4,0],
[2,4,6,4,5],
[3,6,0,8,9]]

console.log(
  x.map(a=>a.map((b,i)=>a.slice(i+1).filter(c=>c!=0).length > 0 || b != 0).filter(b=>b).length - 1)
)

答案 3 :(得分:0)

对于reduce较不受欢迎的兄弟姐妹reduceRight,这实际上是一个很好的用例。这个简单的lambda函数可用于任何大小的数组。

yourArray.reduceRight((acc, val, index) => val && !acc ? index : acc, 0)

答案 4 :(得分:0)

一个简单的传统for循环即可完成工作。

var array = [0, 4, 4, 0, 0];

for (var i = array.length - 1; i > 0 && array[i] === 0; i --) {}

console.log(i);

答案 5 :(得分:0)

您只需将子数组转换为字符串,替换所有结尾的零,然后将字符串长度设为1

let arrs = [
    [0, 4, 4, 0, 0],
    [1, 2, 3, 4, 0],
    [2, 4, 6, 4, 5],
    [3, 6, 0, 8, 9]
];

const res = arrs.map(arr => 
    arr.join('').replace(/0+$/g, '').length - 1
);
console.log(res);

仅使用一个循环来定位每个子数组,而不是一个if。

答案 6 :(得分:0)

希望以下解决方案有帮助,

const inp = [[0,4,4,0,0], [1,2,3,4,0], [2,4,6,4,5], [3,6,0,8,9]]

let stopPosition = inp.map(arr=>{
	let findZeros = arr.join('').match(/[1-9][^1-9]+$/)
	return findZeros !== null ? findZeros["index"] : "No stop position"
	}
)

console.log(stopPosition) 
//[ 2, 3, 'No stop position', 'No stop position' ]

答案 7 :(得分:-1)

假设示例中的第4个值应为4而不是5,则可以使用Array.reduce(),并且对于每次迭代,如果当前值不为0,则返回当前索引:

[0,4,4,0,0].reduce((accumulator, currentItem, currentIndex) => currentItem !== 0 ? currentIndex : accumulator, 0)

第一次迭代,currentItem为0,返回0
第二次迭代,currentItem为4,返回当前索引:1
第三次迭代,currentItem为4,返回当前索引:2
第4次迭代,currentItem为0,返回累加器:2
第5次迭代,currentItem为0,返回累加器:2

修改:更具可读性的版本:

[0,4,4,0,0].reduce((accumulator, currentItem, currentIndex) => {
  return currentItem !== 0 ? currentIndex : accumulator
}, 0)