找出阵列停在哪里的最佳方法



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

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

假设数组输入的长度始终为 5,那么找出数字结束位置(变为 0 并且之后没有数字(的好方法是什么?

我应该得到一个索引值,就像上面的数组一样

2
3
4
4

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

提前谢谢。

如果数组的最后一个数字不是 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;
}
}
}

不是最好的答案,但你可以映射它并获得最终长度

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

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

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

一个简单的传统for循环就可以完成这项工作。

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

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

yourArray.reduceRight((acc, val, index) => val && !acc ? index : acc, 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' ]

您可以简单地将子数组转换为字符串,替换所有尾随零,并取字符串长度 - 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。

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

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

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


编辑:更具可读性的版本:

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

相关内容

最新更新