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

Extracting Index from an Array, that contains each word in the string

本文关键字:数组 单词 字符串 提取 索引 包含      更新时间:2023-09-26

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

如何创建一个函数:

  • 需要 2 个参数:

    1. -字符串
    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";

我建议遍历搜索词并记住位置并使用这些项目构建一个对象。稍后剥离索引并仅返回一个数组。

~ 是按位 not 运算符。它非常适合与indexOf()一起使用,因为如果找到索引0 ... n并且如果不是-1indexOf返回:

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