Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 匹配数组值以返回所有匹配的引用_Javascript_Arrays_Matching - Fatal编程技术网

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解决方案。在我选择答案之前,我将回顾其他几篇文章-谢谢你的努力!解放军有什么理由吗