Javascript 匹配数组值以返回所有匹配的引用
在两个长度不同的数组中匹配记录时,我需要一些帮助 要求:Javascript 匹配数组值以返回所有匹配的引用,javascript,arrays,matching,Javascript,Arrays,Matching,在两个长度不同的数组中匹配记录时,我需要一些帮助 要求: 在两个数组之间查找相同的值 只返回匹配的 将匹配的值推回找到值的数组 示例: var findFrom = ["Apple", "Mango", "Orange", "Mango", "Mango", "Apple"]; var findTheseValues = ["Apple", "Mango"]; Returned Array = ["Apple", "Apple("Matched")", "Ora
- 在两个数组之间查找相同的值
- 只返回匹配的
- 将匹配的值推回找到值的数组
var findFrom = ["Apple", "Mango", "Orange", "Mango", "Mango", "Apple"];
var findTheseValues = ["Apple", "Mango"];
Returned Array = ["Apple", "Apple("Matched")", "Orange", "Mango", "Mango("Matched")", "Mango", "Mango(Matched)", "Apple("Matched")"];
**// Push matched values next to the value that was matched in the FindFrom Array**
var findFrom = ["Apple", "Mango", "Orange", "Banana", "Orange", "Orange","Orange"];
var findTheseValues = ["Orange", "Banana"];
for(let i = 0; i < findFrom.length; i++){
if (findFrom[i] === findTheseValues[i] // toString() if required){
console.log(findFrom[i]);
}
}
我试过:
var findFrom = ["Apple", "Mango", "Orange", "Mango", "Mango", "Apple"];
var findTheseValues = ["Apple", "Mango"];
Returned Array = ["Apple", "Apple("Matched")", "Orange", "Mango", "Mango("Matched")", "Mango", "Mango(Matched)", "Apple("Matched")"];
**// Push matched values next to the value that was matched in the FindFrom Array**
var findFrom = ["Apple", "Mango", "Orange", "Banana", "Orange", "Orange","Orange"];
var findTheseValues = ["Orange", "Banana"];
for(let i = 0; i < findFrom.length; i++){
if (findFrom[i] === findTheseValues[i] // toString() if required){
console.log(findFrom[i]);
}
}
var findFrom=[“苹果”、“芒果”、“橙子”、“香蕉”、“橙子”、“橙子”、“橙子”];
var找到了evalues=[“橙色”、“香蕉色”];
for(设i=0;i
如果我只是将查找这些值的If条件中的“I”替换为0,它将返回匹配的值,但我不希望它只匹配一个值-它应该在两个数组上循环
尝试从ES 6中查找,但它只返回一个匹配的值
如果需要的话,我很乐意解释更多&我感谢您的帮助!:) 您可以使用Arrays-map方法返回一组新的数组,并附加匹配的文本
var returnedArray = findFrom.map((ele)=> {
if(findTheseValues.indexOf(ele)!==-1){
return [ele, ele+"(matcheed)"] // return a pair with appended matched
}else{
return ele;
}
}).join().split(',') // to flatten array.
此解决方案适合我:
var findFrom=[“苹果”、“芒果”、“橙子”、“芒果”、“芒果”、“苹果”];
var发现评估值=[“苹果”、“芒果”];
var解决方案=[];
for(设i=0;i
您可以使用.map()
和.includes()
方法:
让findFrom=[“苹果”、“芒果”、“橙子”、“芒果”、“芒果”、“苹果”],
查找evalues=[“苹果”、“芒果”];
让result=findFrom.map(s=>s+(findTheseValues.includes)`(${s})`:'');
控制台日志(结果)代码>这里有一个不错的解决方案,它使用本机数组方法而不是for循环,这总是一个更好的主意,imho
此外,这还允许您多次查找相同的值,例如,在搜索中多次包含值
让findFrom=[“苹果”、“芒果”、“橙子”、“芒果”、“芒果”、“苹果”];
//请尝试下列任一方法
让我们找到evalues=[“苹果”、“芒果”];
//让我们找到evalues=[“苹果”、“芒果”、“芒果”];
让结果=[];
findFrom.forEach((i)=>{
常量匹配=查找evalues.filter((a)=>i==a);
const result=match.length>0?match.concat(i):i;
结果:push(i);
如果(match.length>0){
match.forEach(m=>results.push(m));
};
});
控制台日志(结果)代码>我会这样做
var findFrom=[“苹果”、“芒果”、“橙子”、“芒果”、“芒果”、“苹果”];
var发现评估值=[“苹果”、“芒果”];
var matches=findFrom.map((e,i)=>{
返回r=查找这些评估值。包括(e)?e+'(匹配)':e;
});
console.log(匹配项)
我之所以写这个答案,是因为提出的所有其他解决方案都是基于对找到的评估值
数组的线性搜索,而使用不同的数据结构肯定可以降低总的计算复杂度:我指的是集
s或映射
s。它们可能是使用哈希表实现的,正如ECMAScript标准所说:
必须使用哈希表或其他机制来实现,这些机制平均提供的访问时间与集合中的元素数呈次线性关系
因此,除了所使用的数据结构之外,我的解决方案几乎与其他解决方案相同
let findTheseValuesSet = new Set(findTheseValues);
let newArray = [];
findFrom.forEach(elem => {
newArray.push(elem);
if (findTheseValuesSet.has(elem))
newArray.push(elem + '(Matched)');
});
您在返回的数组末尾漏掉了一个“apple”
,我错了吗?您的示例不会运行,没有在任何地方定义x。此外,您不能只在其中一个数组上循环,您需要在findFrom上循环,并在该循环中运行FindTheEvalues中的所有元素。为了澄清这一点,您的目的是基于findFrom[]
,创建一个新数组(例如,在您的示例中返回的数组
),当匹配元素被推入到匹配元素右侧的数组中时?您文章中的“返回数组”正确吗?我很难看到这里的一致性。为什么芒果出现4次,而苹果只有3次?为什么芒果出现在橙色之后,即使第一场比赛在橙色之前?为什么苹果没有分组在一起?你真的希望匹配的值包含附加的字符串“matched”吗?将匹配的值推到FindFrom中匹配的值旁边Array@MarcoLuzzara是的,我错过了那一点。thanksPush匹配数组中匹配的值旁边的值这是一个很好的紧凑解决方案,但似乎还没有产生预期的结果。将匹配项包含在同一字符串的参数中,而不是将匹配的元素推到原始值的右侧。但是,唉,既然@rehan还没有澄清,我不是100%肯定。事实上,我不认为你的更新解决了“问题”。也许我错了,但这不是返回数组的形式。谢谢@MohammadUsman——我喜欢你的解决方案,但问题是我希望在原始数组中添加一个新项,如返回数组中所示的“Mango(“Matched”)。下面已经提供了此解决方案。见@Mohammad Usman的答案。明白了!我想当它被贴出来的时候我正在做它。抱歉:)var findFrom=[“苹果”、“芒果”、“橙子”、“芒果”、“芒果”、“苹果”];var发现评估值=[“苹果”、“芒果”];var结果=[];findFrom.forEach((i)=>{var match=findTheseValues.filter((a)=>i==a);var result=match.length>0?match.concat(i):i;results.push(i);if(match.length>0){match.forEach(m=>results.push(m+“(Matched)”);};});控制台日志(结果);Chad您的解决方案就像我想要的那样工作-这不是一个要求,但如果可能的话,您更喜欢一个普通的JS解决方案。在我选择答案之前,我将回顾其他几篇文章-谢谢你的努力!解放军有什么理由吗