从数组中提取索引,该索引包含字符串中的每个单词

时间:2016-02-23 08:45:35

标签: javascript arrays string

很抱歉,如果标题有点误导和不准确,但......不知道如何标题问题。 所以这是(问题)详细描述的。

如何创建以下功能:

  • 需要2个参数:

    1. -a String
    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";

1 个答案:

答案 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>');