假设我有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语句,并且会减慢流程的速度。
谢谢。
答案 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)