gpt4 book ai didi

javascript - 如何找到完整的二维数组行行?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:06:28 25 4
gpt4 key购买 nike

如何获取不包含0的行数?
此尝试仅返回列数,但我需要行数:

var items = [
[1, 0,1],
[3, 3,3],
[5, 6,5]
];
let result=[]
function h(list){
for(let i = 0; i < list.length; i ++){
for(let j = 0; j < list.length; j ++)
{
if(list[i][j]!= 0)
result.push(j)

}
return result;
}

}
console.log(h(items))

结果应该是[1,2]行数

最佳答案

这是一个非常简单的版本:

const h = items => items
.map ( (_, i) => i )
.filter ( i => ! items [i] .some (x => x == 0) )

var items = [ [1, 0, 1], [3, 3, 3], [5, 6, 5] ];

console .log (
h (items)
)

调用 map将外部列表转换为索引列表。
然后使用 filter调用 some,以确定该索引处行中的任何元素是否具有值0。
如果您想要实际的行而不是它们的索引,那么它会更简单: const h = items => items .filter (row => ! row .some (x => x == 0))
更新
从下面的评论:
你能简化一下语法吗?:。(
嗯,不,不是真的。这已经很简单了我们也许应该做点什么。我们在这里滥用最好依赖这样的 map函数:
const range = (lo, hi) => Array .from ( {length: hi - lo}, (_, i) => i )

这里的想法是 range将产生 range(3, 10)(所有以 [3, 4, 5, 6, 7, 8, 9]开始的整数,直到但不包括 lo
然后我们可以这样使用它:
const h = (items) => 
range (0, items.length)
.filter ( i => ! items [i] .some (x => x == 0) )

这并没有使任何事情变得简单,只是重新安排了复杂性。然而,这是值得做的,这是一个更好的版本。
我们还可以更改传递给 hi的函数而不是
  .filter ( i => ! items [i] .some (x => x == 0) )

我们可以很容易地写下:
  .filter ( i => items [i] .every (x => x != 0) )

注意到 filter符号可能比单独的 not-equal符号稍微容易一些这是一个简单的品味问题,而不是根本问题。每一个都同样简单。
我们可能无法使这变得更简单,至少在Javascript中是这样恐怕你的要求是让你更熟悉它Rich Hickey的经典谈话《AA>》解释了复杂性是关于编织不同的关注点。当然简单是相反的,但是我们经常把它和“简单”混淆这是一个非常明显的概念,一个更主观的概念,不是一个很好的软件度量方法。
我可以展示一些改变的步骤,这可能会让一些人更熟悉这是为了证明为什么你不应该这样做,为什么你应该选择简单而不是简单所以请不要把这些当作实际的建议。
使用函数表达式
第一步是用旧的函数表达式替换那些新的尖牙箭头函数
const h = function (items) {
return items.map (function (item, index) {
return index;
})
.filter (function (index) {
return ! items [index] .some (function(value) {
return value == 0;
})
})
}

此版本添加了 notfunction关键字,并将单个表达式体更改为 return { /*...*/。它增加了大量的视觉混乱,而不以任何方式降低复杂性。
但别担心,我们很容易让事情变得更糟。
注意,函数的外壳仍然是一个表达式,结构为 }。我们没有地方方便地添加调试语句。此外,即使我们有这样一个plece,我们仍然没有命名的中间变量来记录。
我们把它修好,好吗?
命名中间值
此版本允许我们在处理的中途添加一个非常重要的 (input).map(someFunction).filter(anotherFunction)语句:
const h = function (items) {
const indices = items .map (function (item, index) {
return index;
});
// console.log(`Indices found`, indices);
const noZeroesIndices = indices .filter (function (index) {
return ! items [index] .some (function(value) {
return value == 0;
});
})
return noZeroesIndices;
}

我们绝对是在远离简单。我们刚刚在代码库中引入了一种新技术:变量赋值。
移动到单个循环
但我们还没有结束我们还需要认真考虑潜在的性能问题。我们的技术包括在行上循环两次,一次查找索引,然后使用它们。如果这超过了数千万行,可能需要比我们一次执行这些步骤多几毫秒的时间。显然,这里存在一些效率低下的问题,应该立即根除。1
同时,大厅下面的人告诉我们 console.log.map的效率比普通的 .filter循环要低。对于 for也必须如此。因此,当我们替换额外的迭代时,我们可以移动到 .some循环。这将意味着引入一些额外的变量。但这都是一个很好的理由。所以它就在这里嗯,美女:
const h = function (items) {
const noZeroesIndices = [];
for (let rowIndex = 0; rowIndex < items.length; rowIndex++) {
const row = items[rowIndex]
let anyZeros = false
for (let index = 0; index < row.length; index++) {
if (row[index] === 0) {
anyZeros = true;
break;
}
}
if (!anyZeros) {
noZeroesIndices.push(rowIndex)
}
}
return noZeroesIndices;
}

结论
请注意,虽然这涉及到很多讽刺,但并不是针对任何个人我在日常工作中做了很多代码检查,虽然我对那些不懂更高级技术的人没有问题,但我经常看到学习它们的阻力。上面的请求让我想起了一个特别的初级开发人员,他把代码评审当作抵制技能进步的时间。花了很长时间,争论太多,但最近,在他接受我的监督三年后,他找到我,感谢我当时肯定没有感觉到的耐心。他告诉我,他从我身上学到的专注于简单,对他的技能和事业有着不可估量的帮助。所以我要继续努力。
这本是开玩笑的。请不要通过在代码中增加复杂性来优化性能,除非您已经进行了剖析,并且可以证明该特定部分是导致不可接受的执行速度的实际瓶颈之一。

关于javascript - 如何找到完整的二维数组行行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56691128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com