我有一个数组,我想使用.filter
来计算其中每个值的数量,但是我的函数似乎忽略了另一个函数pushed
的任何值。
我的代码看起来像这样:
var arrToCheck = []
var ones = arrToCheck.filter(function(x) { return x == 1; })
var twos = arrToCheck.filter(function(x) { return x == 2; })
var threes = arrToCheck.filter(function(x) { return x == 3; })
function checkLength(input) {
length = input.length
switch (length) {
case 1:
arrToCheck.push(1)
break;
case 2:
arrToCheck.push(2)
break;
case 3:
arrToCheck.push(3)
break;
default:
console.log ("length too long")
}
}
例如,如果输入为[A,I,TO,BUT,THE,SHE],则
arrToCheck
应该返回[1, 1, 2, 3, 3, 3]
ones
应该返回[1, 1]
。
但是,当我进行测试时,尽管arrToCheck
返回的值包括预期的推入值,但是ones
数组将为空。
.filter
函数似乎可以正常工作,因为当我在源代码的arrToCheck
数组中输入值时,.filter
函数会注册这些值。它只是忽略由checkLength
开关推动的任何1。
我也曾尝试在不同的地方将1的值从字符串更改为数字,但是这并没有起到什么作用(与预期的一样)。
因此,似乎各个位都在工作,但它们不能一起工作?我想念什么吗?
(还有一个额外的问题,当array.filter函数返回错误“ TRUE不是函数”时,我做错了什么?)
答案 0 :(得分:1)
解决方案的问题是您没有将字符串长度放入arrToCheck
数组中。这就是您可能想要得到的(在代码下面使用arrow functions)
var input=["A", "I", "TO", "BUT", "THE", "SHE"]
var arrToCheck = input.map(x=>x.length);
var ones = arrToCheck.filter(x => x == 1)
var twos = arrToCheck.filter(x => x == 2)
var threes = arrToCheck.filter(x => x == 3)
// show results
j=JSON.stringify;
console.log('arrToCheck',j(arrToCheck));
console.log('ones',j(ones));
console.log('twos',j(twos));
console.log('threes',j(threes));
答案 1 :(得分:0)
.filter
并不是在数组上持续运行的不可思议的事物,它只是在数组上执行一次就已执行。每次要过滤内容时,您都需要运行.filter
。
答案 2 :(得分:0)
您只需要致电这些行
var ones = arrToCheck.filter(function(x) { return x == 1; })
var twos = arrToCheck.filter(function(x) { return x == 2; })
var threes = arrToCheck.filter(function(x) { return x == 3; })
初始化arrToCheck
数组后。
var arrToCheck = []
function checkLength(input) {
length = input.length
switch (length) {
case 1:
arrToCheck.push(1)
break;
case 2:
arrToCheck.push(2)
break;
case 3:
arrToCheck.push(3)
break;
default:
console.log ("length too long")
}
}
['A', 'I', 'TO', 'BUT', 'THE', 'SHE'].forEach(x=>checkLength(x))
var ones = arrToCheck.filter(function(x) { return x == 1; })
var twos = arrToCheck.filter(function(x) { return x == 2; })
var threes = arrToCheck.filter(function(x) { return x == 3; })
console.log(ones)
答案 3 :(得分:0)
在编写的checkLength()函数中,您的input.length指的是您要传入的数组的长度-而不是数组内部字符串的长度。
允许我建议对checkLength进行稍微修改的版本:
function checkLength(input) {
console.log(`input is ${input}`);
console.log(`input.length is ${input}`);
length = input.length
switch (length) {
case 1:
arrToCheck.push(1)
break;
case 2:
arrToCheck.push(2)
break;
case 3:
arrToCheck.push(3)
break;
default:
console.log (`unexpected length: ${length}`)
}
}
如果您这样做并运行
const input = ['A', 'I', 'TO', 'BUT', 'THE', 'SHE'];
checkLength(input);
您将看到有用的调试信息:
input is A,I,TO,BUT,THE,SHE
input.length is A,I,TO,BUT,THE,SHE
unexpected length: 6
希望能帮助您摆脱困境。
如有疑问,请添加一些console.logs()
来验证您的理解,或提供有关代码与您的意图不同之处的见识。
答案 4 :(得分:0)
您需要在新输入到达时更新数组,我已经将此更新过程包装在一个函数上,并在将新输入推入arrToCheck
之后调用了该更新过程。另外,我还简化了switch ... case
块使用的逻辑。
var arrToCheck = [];
var ones = [], twos = [], threes = [];
function updateFilters()
{
ones = arrToCheck.filter(function(x) { return x == 1; });
twos = arrToCheck.filter(function(x) { return x == 2; });
threes = arrToCheck.filter(function(x) { return x == 3; });
}
function checkLength(input)
{
length = input.length;
if (length && length <= 3)
arrToCheck.push(length);
else
console.log ("length too long")
updateFilters();
}
// Main code:
checkLength("AA");
checkLength("AAA");
checkLength("AAAA");
checkLength("A");
console.log(
JSON.stringify(ones),
JSON.stringify(twos),
JSON.stringify(threes)
);
checkLength("AA");
checkLength("AAA")
console.log(
JSON.stringify(ones),
JSON.stringify(twos),
JSON.stringify(threes)
);