很抱歉,如果标题有点误导和不准确,但......不知道如何标题问题。 所以这是(问题)详细描述的。
如何创建以下功能:
需要2个参数:
并返回已分解字符串的索引
*此数组中的元素可以包含/包含多个单词 (即"灰狗")
让我通过显示字符串,数组和所需的输出来向您展示我的意思:
var animals = [
"Grey Dog", //0
"Lion", //1
"2 Cats", //2
"Black Widow Spider", //3
"Hippo", //4
"Bird" //5
]
var userInputText = "2 Cats Hippo Grey Dog Lion Hippo Lion 2 Cats Black Widow Spider Hippo Hippo";
var output = decomposeStringToIndexes(animals ,userInputText);
当我跟踪/记录/检查输出变量时,它将包含:
output = [
2,//2 Cats
4,//Hippo
0,//Grey Dog
1,//Lion
4,//Hippo
1,//Lion
2,//2 Cats
3,//Black Widow Spider
4,//Hippo
4//Hippo
];
编辑:
字符串(userInputText)将只包含数组中列出的单词(动物)
每个空格之间可以有多个空格(即'') 字
类似的东西:
var userInputText = "2 Cats Hippo Grey Dog Lion Hippo Lion 2 Cats Black Widow Spider Hippo Hippo";
答案 0 :(得分:2)
我建议迭代搜索词并记住位置并使用这些项构建对象。稍后剥离索引并返回一个数组。
~
是bitwise not operator。它非常适合与indexOf()
一起使用,因为indexOf
如果找到索引0 ... n
则返回,如果不是-1
则返回:value ~value boolean -1 => 0 => false 0 => -1 => true 1 => -2 => true 2 => -3 => true and so on
function decomposeStringToIndexes(array, string) {
var found = {};
array.forEach(function (a, i) {
var p = 0,
pos = string.indexOf(a);
while (~pos) { // equal to pos !== -1
found[pos] = i;
p = pos + a.length;
pos = string.indexOf(a, p);
}
});
return Object.keys(found)
.map(Number)
.sort(function (a, b) { return a - b; })
.map(function (k) { return found[k]; });
};
var animals = ["Grey Dog", "Lion", "2 Cats", "Black Widow Spider", "Hippo", "Bird"],
userInputText = "2 Cats Hippo Grey Dog Lion Hippo Lion 2 Cats Black Widow Spider Hippo Hippo",
output = decomposeStringToIndexes(animals, userInputText);
document.write('<pre>' + JSON.stringify(output, 0, 4) + '</pre>');