javascript - 当另一个数组具有数字(值)时如何匹配 2 个数组的字符串值

标签 javascript arrays loops iterable

我是 Javascript 新手。我试图获取数组 (arr1) 的 Math.max(...arr1[i][1]),仅当它与第二个数组 (arr2) 匹配时。然后,将它推到数组(arr3)上,结果应该没有重复值。

我尝试迭代两个数组(arr1 和 arr2),然后使用“if 语句”来匹配它们。

var arr1 = [ [ 'abandon', -2 ],
[ 'abandon', 1 ],
[ 'abandon', -2 ],
[ 'abduct', 1 ],
[ 'abduct', -2 ],
[ 'abduct', -2 ],
[ 'abhor', -3 ],
[ 'abhor', 1 ],
[ 'abhor', -1 ],
[ 'abil', 2 ],
[ 'abil', 4 ] ];


var arr2 = [ [ 'abandon' ],
[ 'abil' ],
[ 'abhor' ],
[ 'abduct' ],
['test'],
['hey'],
['testAgain'],
['array']];

var arr3 = [];

const mapping = arr2.map(word => {
    return word
})

for(var i = 0; i < arr1.length; i++){

    if(arr1[i][0] === mapping){
        arr3.push(Math.max(...arr1[i][1]))
    }

}
let arr4 = [...new Set(arr3)]

//example result:

var arr4 = [[abandon, -2],
[abduct, -2],
[abhor, -3],
[abil, 4]... and so on]

我知道我做错了什么,我别无选择。需要帮助。

最佳答案

您最好直接使用 Set 而不是像 arr2 这样的数组来查找匹配项,因为在 Set< 的情况下它将是恒定时间查找

然后使用Array.prototype.filter 过滤数组arr1 并得到那些在arr2 中的数组。

最后,Array.prototype.reduce 将帮助您创建一个对象,其键是单词,值是 arr1 中该单词的最大值,您可以使用 reduce 返回的对象中的 Object.entries 获取二维数组形式的数据:

var arr1 = [ [ 'abandon', -2 ],
[ 'abandon', 1 ],
[ 'abandon', -2 ],
[ 'abduct', 1 ],
[ 'abduct', -2 ],
[ 'abduct', -2 ],
[ 'abhor', -3 ],
[ 'abhor', 1 ],
[ 'abhor', -1 ],
[ 'abil', 2 ],
[ 'abil', 4 ] ];


var arr2 = [ [ 'abandon' ],
[ 'abil' ],
[ 'abhor' ],
[ 'abduct' ],
['test'],
['hey'],
['testAgain'],
['array']];

var lookup = new Set(arr2.flat());
var mapping = arr1.filter(([word, val]) => lookup.has(word));
var data = Object.entries(mapping.reduce((acc, o, i) => {
    if(acc[o[0]]){
        acc[o[0]] = Math.max(o[1], acc[o[0]]);
    }else{
        acc[o[0]] = o[1];
    }
    return acc;
},{}));

console.log(data);

编辑

根据您的评论,我假设您使用的是旧版本的节点运行时,其中 flat() 不存在于 Array.prototype 中。因此,您可以使用以下经过编辑的代码段:

var arr1 = [ [ 'abandon', -2 ],
[ 'abandon', 1 ],
[ 'abandon', -2 ],
[ 'abduct', 1 ],
[ 'abduct', -2 ],
[ 'abduct', -2 ],
[ 'abhor', -3 ],
[ 'abhor', 1 ],
[ 'abhor', -1 ],
[ 'abil', 2 ],
[ 'abil', 4 ] ];


var arr2 = [ [ 'abandon' ],
[ 'abil' ],
[ 'abhor' ],
[ 'abduct' ],
['test'],
['hey'],
['testAgain'],
['array']];

//flatten using Array.prototype.concat
var lookup = new Set([].concat.apply([], arr2)); 
//If Set doesn't work use the array, but this will not be a constant time lookup
//var lookup = [].concat.apply([], arr2);  

var mapping = arr1.filter(([word, val]) => lookup.has(word));
//If you are not using Set and going with an array, use Array.prototype.includes, so search won't be O(1)
//var mapping = arr1.filter(([word, val]) => lookup.includes(word));

var data = Object.entries(mapping.reduce((acc, o, i) => {
    if(acc[o[0]]){
        acc[o[0]] = Math.max(o[1], acc[o[0]]);
    }else{
        acc[o[0]] = o[1];
    }
    return acc;
},{}));

console.log(data);

关于javascript - 当另一个数组具有数字(值)时如何匹配 2 个数组的字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58112627/

相关文章:

javascript - React JS 意外的保留字 'await'

javascript - jquery灯开关设置起始状态

java - 从未排序数组构建最大堆会遵循二叉树属性吗?

c++ - 数组填充错误

r - 根据另一列中的行子集从多列中获取最大值

swift:在循环条件语句中使用或

javascript - 基于另一个数组对数组进行排序的最快方法

c# - 有没有办法保护我的幻灯片图像

arrays - 在 mongoDB 中使用数组索引获取数组元素

iphone - 将 URL(作为字符串)添加到数组时出现问题