2016-11-14 20 views
0

我有一個惡夢,試圖弄清楚爲什麼無論輸入什麼,該函數總是返回true。所討論的文檔是JSON文件。我已經把它變成變量測試,其結果總是看起來是真實的,不管什麼test_type「的是:無論輸入如何,函數返回true

var doc = { 
 
    "test_type": "test3" 
 
}; 
 

 
var ignore = ['test1', 'test2', 'test3']; 
 

 
test = (ignore.some(function(v) { 
 
    return doc.test_type.toLowerCase().indexOf(v) == -1; 
 
})); 
 
console.log('Test:', test);

但是,如果我用下面的代碼相反,它會只有'test_type'值在'ignore'數組中時才返回true。所以這將返回false。

var doc = { 
 
    "test_type": "test4" 
 
}; 
 

 
var ignore = ['test1', 'test2', 'test3']; 
 

 
test = (ignore.some(function(v) { 
 
    return doc.test_type.toLowerCase().indexOf(v) >= 0; 
 
})); 
 

 
console.log('Test:', test);

我想要做的是檢查是否test_type陣列中的值相匹配,或者更準確地說,如果從陣列中的字符串,可以發現作爲test_type陣列內的子串,和如果是,則從輸出中排除文檔。

+0

我正困惑你*不*想,爲什麼沒有那些片段是爲你工作...... – deceze

+0

也許你需要小寫數組元素,'return doc.test_type.toLowerCase()。indexOf(v.toLowerCase)> = 0' – Mihir

+2

你的第二個函數是正確的。如果任何元素符合條件,some()將返回true。這就是爲什麼你的第一個函數總是返回「true」。 –

回答

0

如果我理解正確的問題,的

ignore.some(function(v) 
      { 
       return doc.test_type.toLowerCase().indexOf(v) == -1; 
      }); 

語義將是檢查是否忽略包含不test_type出現的元素,這將是你的電話的情況。

1

test_type屬性不是一個數組,而是一個簡單的字符串。那麼你不應該使用indexOf而只是遍歷你的陣列並檢查它是否在test_type值相匹配

var doc = { 
 
    "test_type": "test3 test5" 
 
}; 
 

 
var array1 = ['test1', 'test2', 'test3']; // true 
 
var array2 = ['test1', 'test2', 'test4']; // false 
 

 
var docTestTypes = doc.test_type.split(" "); 
 

 
var test1 = array1.some(function(elem, index, array) { 
 
    return docTestTypes.indexOf(elem.toLowerCase()) !== -1; 
 
}); 
 

 
var test2 = array2.some(function(elem, index, array) { 
 
    return docTestTypes.indexOf(elem.toLowerCase()) !== -1; 
 
}); 
 

 
console.log("test 1 : " + test1); 
 
console.log("test 2 : " + test2);

+0

if他可以使用indexOf,它可以通過使用: return array1.indexOf(elem.toLowerCase())!= -1; – FvB

+0

@FvB你的代碼是錯誤的。你正在檢查你正在迭代的元素是否在你正在迭代的數組中......這將永遠是真的。然而'indexOf'確實沒有必要 – Weedoze

+0

對不起,我沒有明確的是JSON可能包含,例如,「test3 test」。但我仍然希望它能夠確定數組中的任何值是否可以在「test_type」中找到。所以「test3測試」仍然會返回true。 – hoskarl