当另一个数组具有数字(值)时如何匹配 2 个数组的字符串值
How to match the string values of 2 arrays when the other array has a Number(value)
我是 Javascript 的新手。我正在尝试获取数组 (arr1) 的 Math.max(...arr1[i][1]),仅当它与第二个数组 (arr2) 匹配时。然后,将它推到数组(arr3)上,结果应该没有重复值。
我尝试迭代两个数组(arr1 和 arr2),然后使用 "if statement" 来匹配它们。
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
中该单词的最大值,您可以使用 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);
我会使用尽可能少的循环。
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']];
function getHighestResults(dataArr, filterArr) {
var name = ''; // higher readability in code and created outside
var number = -1; // for loops to avoid creating variables inside of them
function existsInObject(obj, name) {
return obj.hasOwnProperty(name);
}
function filterBasedOn(arr, obj) {
var filteredArr = [];
for (let i = 0; i < arr.length; i++) {
name = arr[i][0];
if (existsInObject(obj, name)) {
filteredArr.push([name, obj[name]]);
}
}
return filteredArr;
}
function getHighestValuesAsObj(arr) {
var dataObj = {};
for (let i = 0; i < arr.length; i++) {
name = arr[i][0];
number = arr[i][1];
if (!existsInObject(dataObj, name) || dataObj[name] < number) {
dataObj[name] = number;
}
}
return dataObj;
}
return filterBasedOn(filterArr, getHighestValuesAsObj(dataArr));
}
console.log(getHighestResults(arr1, arr2));
我是 Javascript 的新手。我正在尝试获取数组 (arr1) 的 Math.max(...arr1[i][1]),仅当它与第二个数组 (arr2) 匹配时。然后,将它推到数组(arr3)上,结果应该没有重复值。
我尝试迭代两个数组(arr1 和 arr2),然后使用 "if statement" 来匹配它们。
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
中该单词的最大值,您可以使用 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);
我会使用尽可能少的循环。
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']];
function getHighestResults(dataArr, filterArr) {
var name = ''; // higher readability in code and created outside
var number = -1; // for loops to avoid creating variables inside of them
function existsInObject(obj, name) {
return obj.hasOwnProperty(name);
}
function filterBasedOn(arr, obj) {
var filteredArr = [];
for (let i = 0; i < arr.length; i++) {
name = arr[i][0];
if (existsInObject(obj, name)) {
filteredArr.push([name, obj[name]]);
}
}
return filteredArr;
}
function getHighestValuesAsObj(arr) {
var dataObj = {};
for (let i = 0; i < arr.length; i++) {
name = arr[i][0];
number = arr[i][1];
if (!existsInObject(dataObj, name) || dataObj[name] < number) {
dataObj[name] = number;
}
}
return dataObj;
}
return filterBasedOn(filterArr, getHighestValuesAsObj(dataArr));
}
console.log(getHighestResults(arr1, arr2));