Javascript编程模式(函数)不清晰。为什么结果不同? 在Chrome控制台内,我有一个字符串:
然后使用两种方法对其进行修改并分配给新值,这两种方法看起来与我相同: 第一种方法: 第二种方法: 这两种方法都应该做什么:Javascript编程模式(函数)不清晰。为什么结果不同? 在Chrome控制台内,我有一个字符串:,javascript,arrays,string,function,Javascript,Arrays,String,Function,然后使用两种方法对其进行修改并分配给新值,这两种方法看起来与我相同: 第一种方法: 第二种方法: 这两种方法都应该做什么: 将字符串分别转换为每个单词的数组 过滤数组,使其不存在重复值 将数组转换回字符串格式 我希望string2和string3的值为: 它们应该完全相同(根据我的逻辑) 我实际得到的是: 第二个字符串中缺少“约翰” 我已经检查的内容: 在内部执行的严格比较(==) if语句()对于第一个“john”为true 两个索引(参数 第一个“john”的值的索引是 按预期为0 我的问题
var string2 = string.split(", ").filter(function(value, index, array){
if(index === array.indexOf(value)) return index;
}).join(', ');
行if(index==array.indexOf(value))返回索引代码>是错误的
如果index==array.indexOf(value)
,则返回index
,否则不返回任何内容。您需要返回true
或false
在JavaScript中,除0
之外的所有数字都转换为true
,而0
转换为false
。因此,如果索引
为0
,则基本上返回的是false
,而不是true
这是正确的代码:
var string2 = string.split(", ").filter(function(value, index, array){
if(index === array.indexOf(value)) return true;
else return false;
}).join(', ');
你的第二个例子:
var string2 = string.split(", ").filter(function(value, index, array){
if(index === array.indexOf(value)) return index;
}).join(', ');
行if(index==array.indexOf(value))返回索引代码>是错误的
如果index==array.indexOf(value)
,则返回index
,否则不返回任何内容。您需要返回true
或false
在JavaScript中,除0
之外的所有数字都转换为true
,而0
转换为false
。因此,如果索引
为0
,则基本上返回的是false
,而不是true
这是正确的代码:
var string2 = string.split(", ").filter(function(value, index, array){
if(index === array.indexOf(value)) return true;
else return false;
}).join(', ');
vs
这只是第一种情况下索引为零的问题,返回的索引为零,这解决了tofalse
,而它应该是true
,就像第二种情况一样
vs
这只是第一种情况下索引为零的问题,您返回的索引为零,这解决了tofalse
,而它应该是true
,就像第二种情况一样。您的结果是相反的。第一个代码块是消除“John”的代码块。(编辑问题以更正此问题)
对于string3
,它消除了“John”,因为它返回“John”索引的唯一时间是“John”位于索引0
,这是一个错误的值,因此“John”不会包含在结果中
如果您返回一个布尔值(如工作示例中所示)会更清楚,因此当值本身为假时,您不需要处理问题。您的结果是相反的。第一个代码块是消除“John”的代码块。(编辑问题以更正此问题)
对于string3
,它消除了“John”,因为它返回“John”索引的唯一时间是“John”位于索引0
,这是一个错误的值,因此“John”不会包含在结果中
如果您返回一个布尔值(如工作示例中所示)会更清楚,因此当值本身为假时,您不需要处理问题。第一个值没有意义。您必须始终从过滤器
谓词函数返回一个布尔值-有时不是未定义
,有时是一个数字。您的“我实际得到的”结果看起来是相反的。1。我得到了用于string2的函数:2。由于错误,交换了post中的功能。现在它是正确的。您的第二个方法对我来说很好,没有返回重复项:string3==“john、bob、nina、colin、luck、robert、jack”
。我不确定托尼在你的预期结果中来自何方。第一个毫无意义。您必须始终从过滤器
谓词函数返回一个布尔值-有时不是未定义
,有时是一个数字。您的“我实际得到的”结果看起来是相反的。1。我得到了用于string2的函数:2。由于错误,交换了post中的功能。现在它是正确的。您的第二个方法对我来说很好,没有返回重复项:string3==“john、bob、nina、colin、luck、robert、jack”
。我不确定托尼在你的预期成绩中来自何方。这就是问题所在!所以,我只需要返回值而不是索引?谢谢你,尼娜·斯科尔斯@Eduard否,您应该既不返回值也不返回索引。您应该返回一个布尔值。@bergi如果我返回该值,它就会工作(尽管我知道它在语义上是不正确的)。因此,如果我继续使用.fiter(),就没有正确的解决方法。然后我是否应该将.filter()函数换成其他函数?@Eduard如果返回true
,请检查我的答案。@Eduard返回值
可能适用于您的特定情况,但它不正确。我重复:filter
期望回调返回布尔值(true或false)。其他任何东西都将被转换为一。错误的值(如索引
0,或空字符串值
)会弄乱结果。所以只要使用返回检查
,或者如果(检查)返回true;否则返回false代码>如果你坚持使用if
语句。这就是问题所在!所以,我只需要返回值而不是索引?谢谢你,尼娜·斯科尔斯@Eduard否,您应该既不返回值也不返回索引。您应该返回一个布尔值。@bergi如果我
string2 = "john, bob, tony, nina, colin, luck, robert, jack";
string3 = "bob, tony, nina, colin, luck, robert, jack"
var string2 = string.split(", ").filter(function(value, index, array){
if(index === array.indexOf(value)) return index;
}).join(', ');
var string2 = string.split(", ").filter(function(value, index, array){
if(index === array.indexOf(value)) return true;
else return false;
}).join(', ');
if (index === array.indexOf(value)) return index; // returns 0, at index 0,
// should return true
return index === array.indexOf(value);