javascript - 当另一个数组有一个数字(值)时如何匹配2个数组的字符串值
问题描述
我是 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]
我知道我做错了什么,我别无选择。需要帮忙。
解决方案
您可以更好地使用 aSet
而不是直接使用数组arr2
来查找匹配项,因为在 a 的情况下它将是恒定时间查找Set
。
然后使用 aArray.prototype.filter
过滤数组arr1
并获取arr2
.
最后Array.prototype.reduce
将帮助您创建一个对象,其中键是单词,值是该单词中的最大值,arr1
您可以使用Object.entries
从返回的对象reduce
获取二维数组形式的数据:
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);
推荐阅读
- c - 为什么我的程序在 C 中给出双文件扩展名时只读取文件名?
- node.js - 如何更改新的 mongodb.ObjectId 使其再次工作
- javascript - javascript中未检测到对象长度数组
- regex - 使用简单的英语为 AutoHotkey 生成正则表达式?
- javascript - 如何配置 playwright-jest 以排除测试套件(规范)文件以进行运行?
- groovy - GroovyScriptEngine 官方演示不适用于动态脚本依赖重新加载
- php - 未定义类型 'Dotenv\Dotenv\Dotenv'
- c++ - OpenGL清除颜色Alpha通道不起作用
- cpu - 每个 cpu 指令是否都由其核心的逻辑门实现?
- gcc - GCC 使用什么来代替 GEP?