Javascript 搜索对象并将其推送到新位置

Javascript 搜索对象并将其推送到新位置,javascript,jquery,Javascript,Jquery,我试着把句子从一个地方推到另一个地方 这完全取决于找到了哪些关键字。如果一个句子有两个关键字,那么它会被推到第一个关键字 cat-将包含cat的所有句子推送到关键字found.cats 狗-将所有包含狗的句子推送到关键字found.dogs 仓鼠-将包含仓鼠的所有句子推送到关键字found.hambers var data=“我有一只东方猫。我有一只狗和一只猫。我总是照顾我的美国短毛猫。我有一只伯曼猫。我父母给我买了两只金猎犬。我的狗是德国牧羊犬。我一直想要一只仓鼠。我没有宠物。” var

我试着把句子从一个地方推到另一个地方

这完全取决于找到了哪些关键字。如果一个句子有两个关键字,那么它会被推到第一个关键字

  • cat-将包含cat的所有句子推送到关键字found.cats
  • 狗-将所有包含狗的句子推送到关键字found.dogs
  • 仓鼠-将包含仓鼠的所有句子推送到关键字found.hambers
var data=“我有一只东方猫。我有一只狗和一只猫。我总是照顾我的美国短毛猫。我有一只伯曼猫。我父母给我买了两只金猎犬。我的狗是德国牧羊犬。我一直想要一只仓鼠。我没有宠物。”
var userInput={
全部:[
“我有一只东方猫。”,
“我有一只狗和一只猫。”,//应该只推第一只狗
“我总是照顾我的美国短毛猫。”,
“我有一只伯曼猫。”,
“我父母给我买了两只金毛猎犬。”,
“我的狗是德国牧羊犬。”,
“我一直想要一只仓鼠。”,
“我没有宠物。”
],
关键词基金:{
猫:[/*在这里用猫推送所有句子*/],
狗:[/*在这里用狗推送所有句子*/],
仓鼠:[/*在此处推送所有与仓鼠有关的句子*/]
},
NoKeywords查找:[],
}
函数搜索(术语){
if(userInput.all.indexOf(term)!=-1){
如果(术语=='cat'){
}
如果(术语==‘狗’){
}
如果(术语==‘仓鼠’){
}
} 
否则{
//Push to NoKeywords作为数组查找
}
}
//谁先到谁就被推
搜索('cat')
搜索('dog')//包含

search('仓鼠')//包含
好的,因此您使用的是正确的,但使用的位置不正确(
userInput.all.indexOf(term)
):)

因此,您应该在
search()
函数中执行以下操作:

1) 循环检查
userInput的每个元素。all
-您可以对
循环执行常规的
,或使用以获取所有匹配的句子

2) 现在,在循环内部,对每个元素使用,检查它是否包含搜索项

3) 如果找到术语,则插入所需集合

因此,我将稍微更改您的代码,如下所示:

var userInput={
全部:[
“我有一只东方猫。”,
“我有一只狗和一只猫。”,//应该只推第一只狗
“我总是照顾我的美国短毛猫。”,
“我有一只伯曼猫。”,
“我父母给我买了两只金毛猎犬。”,
“我的狗是德国牧羊犬。”,
“我一直想要一只仓鼠。”,
“我没有宠物。”
],
关键词基金:{
猫:[],
狗:[],
仓鼠:[]
},
NoKeywords查找:[],
}
函数搜索(术语){
//这里你们可以做一个基本的for循环,但我使用的是reduce函数
var foundItems=null;
foundItems=userInput.all.reduce(函数(已找到,当前){
if(~current.indexOf(term)){
发现。推送(电流);
}
发现退货;
}, []);
开关(术语){
“猫”一案:{
userInput.keywordsFound.cats=foundItems;
}中断;
“狗”案:{
userInput.keywordsFound.dogs=foundItems;
}中断;
“仓鼠”一案:{
userInput.keywordsFound.仓鼠=foundItems;
}中断;
}
}
搜索(“猫”);
console.log(‘带猫的句子’)
log(userInput.keywordsFound.cats);
搜查(“狗”);
console.log(‘带狗的句子’)
log(userInput.keywordsFound.dogs);
搜索(“仓鼠”);
console.log(‘带仓鼠的句子’)

log(userInput.keywordsFound.仓鼠)
尝试使用ES6箭头函数、和数组函数,并确定要推送的正确
变量:
userInput.keywordsFound[key].push(str)

代码:

const userInput={
所有人:[“我有一只东方猫”,“我有一只狗和一只猫”,“我总是照顾我的美国短毛猫”,“我有一只伯曼猫”,“我父母给我买了两只金猎犬”,“我的狗是德国牧羊犬”,“我一直想要一只仓鼠”,“我没有宠物”],
关键词基金:{
猫:[],
狗:[],
仓鼠:[]
},
NoKeywords查找:[],
},
搜索=术语=>{
userInput.all.forEach(str=>{
const key=Object.keys(userInput.keywordsFound.find)(k=>k.includes(term));
key&&str.includes(term)&&userInput.keywordsFound[key].push(str);
});
};
//谁先到谁就被推
搜索(“猫”);
搜查(“狗”)//包含狗
搜查(“火腿”)//包含仓鼠

log(userInput.keywordsFound)
您正在调用
search('仓鼠')
,同时在
search
函数中查找
if(term=='仓鼠'){
。你必须纠正测试或调用,使其正常工作。要改进代码,请使用
开关,而不是几个
if
。这对阅读和性能都有好处。无论仓鼠搜索文本如何,代码都不会正常工作……我对编码是新手,我正在尝试一步一步地找出它。我将研究开关是什么…我仍然是这方面的初学者。问题还不是很清楚。为什么你首先需要这样一个不规则的结构?为什么你要变异
userInput
?@YuryTarabanko我用JavaScript
开关盒更新了iTunes,以获取基于最终用户输入的搜索输入
术语
的逻辑。不要认为这是个好主意因为您可以通过
Object.keys(userInput.keywordsFound.find)(k=>k.includes(term))动态地获得它
检查我的回答是的,如果输入数据来自用户,使用
开关并不是最好的选择,但它在这个特定的用例中会起作用。感谢您指出这一点。无论如何,您的解决方案就在那里,如果有人需要,可以使用它。