我有一个单词数组,我想在文本数组中搜索单词,找到它们并检查单词后的下一个元素或元素是否为数字,将单词中的数字或数字推入新对象并将对象推入新数组。这样的:
words = ['blue' , 'red' , 'yellow' , 'grin' , 'black' , 'white'];
text = ['xxx' , 'yyy' , 'red' , 'zzz' , 'black' , 65 , 54 , 'white' , 'aaa' , 'yellow' , 50 , 'ppp'];
Output I want:
[{'black' : [65 , 54] , 'yellow' : [50]}];
但是我现在的代码只是返回单词后的数字并将它们推入新的数组:
words = ['blue' , 'red' , 'yellow' , 'grin' , 'black' , 'white'];
text = ['xxx' , 'yyy' , 'red' , 'zzz' , 'black' , 65 , 54 , 'white' , 'aaa' , 'yellow' , 50, 'ppp'];
const set = new Set(words);
let result = [];
for (let i = 0; i < text.length; i++) {
if (set.has(text[i])) {
while (typeof text[i + 1] == "number") {
result.push(text[++i]);
}
}
}
console.log(result)
//output : [65 , 54 , 50]
那么如何将数字和它们的键推入数组呢?
您没有正确地创建对象并将其推入主数组。您正在检查text
中的节点是否存在于数组words
中,如果发现存在,则将找到的单词后面的数字正确地推入数组。但你不应该把它推入一个普通数组。相反,您应该将其推入具有您找到的键作为匹配的对象,它应该最初声明为空数组。后面的数需要被压入这个数组
请找到相同的工作小提琴
const words = ['blue', 'red', 'yellow', 'grin', 'black', 'white'];
// const text = ['black' , 50 , 'black' , 600 , 10 , 'black' , 40];
const text = ['xxx', 'yyy', 'red', 'zzz', 'black', 65, 54, 'white', 'aaa', 'yellow', 50, 'ppp'];
const set = new Set(words);
const finalResult = [];
for (let i = 0; i < text.length; i++) {
if (set.has(text[i])) {
const newObj = {};
const key = text[i];
const result = [];
while (typeof text[i + 1] == "number") {
result.push(text[++i]);
}
if (result.length > 0) {
newObj[key] = result
finalResult.push(newObj);
}
}
}
console.log(finalResult);
Array.reduce
实现您的要求将是这样的
const words = ['blue', 'red', 'yellow', 'grin', 'black', 'white'];
// const text = ['black' , 50 , 'black' , 600 , 10 , 'black' , 40];
const text = ['xxx', 'yyy', 'red', 'zzz', 'black', 65, 54, 'white', 'aaa', 'yellow', 50, 'ppp'];
const modifiedText = text.reduce((acc, curr, index) => {
if (typeof text[index] === "string" && typeof text[index + 1] === "number" && words.includes(curr)) {
const newArr = [];
let startIndex = index + 1;
while (text[startIndex] && typeof text[startIndex] === "number") {
newArr.push(text[startIndex]);
startIndex++;
}
if(newArr.length) {
acc.push({[curr] : newArr });
}
}
return acc;
}, []);
console.log(modifiedText);
如果找到匹配的单词,仍然在result
数组中收集数字。但是对于每个匹配的单词,您从一个空数组开始。
您不希望在i
上使用自增运算符来遍历text
。
res
是一个Object
,其中匹配的字存储为键,result
数组存储为值。
words = ['blue' , 'red' , 'yellow' , 'grin' , 'black' , 'white'];
text = ['xxx' , 'yyy' , 'red' , 'zzz' , 'black' , 65 , 54 , 'white' , 'aaa' , 'yellow' , 50, 'ppp'];
const set = new Set(words);
let res = {};
for (let i = 0; i < text.length; i++) {
if (set.has(text[i])) {
let result = [];
let j = i;
while (typeof text[j + 1] == "number") {
result.push(text[++j]);
}
if(result.length > 0) res[text[i]] = result;
}
}
console.log(res)
您需要推送一个包含单词作为键和所需数字的对象。
之类的words = ['blue' , 'red' , 'yellow' , 'grin' , 'black' , 'white'];
text = ['xxx' , 'yyy' , 'red' , 'zzz' , 'black' , 65 , 54 , 'white' , 'aaa' , 'yellow' , 50, 'ppp'];
const set = new Set(words);
let result = [];
for (let i = 0; i < text.length; i++) {
if (set.has(text[i]) && typeof text[i + 1] == "number") {
let key = text[i]
let arr = []
while (typeof text[i + 1] == "number") {
arr.push(++i)
}
result.push({[key]: arr})
}
}
console.log(result)