首页 > 解决方案 > 根据数组的元素从数组中提取元素

问题描述

我有一个可以匹配此数据结构的任何组合的结果集:

[ ["1st", "FELONY"], ["2nd", "FELONY"],  ["3nd", "FELONY"], ["1st", "MISDEMEANOR"], ["2nd", "MISDEMEANOR"], ["3rd", "MISDEMEANOR"]]  

所以它可能是这样的:

[  ["2nd", "FELONY"], ["2nd", "MISDEMEANOR"], ["1st", "MISDEMEANOR"]]           

或这个:

[ ["1st", "MISDEMEANOR"], ["2nd", "MISDEMEANOR"]]    

或元素的其他组合和顺序。

如果数组有一个重罪的子数组,那么我想忽略 MISDEMEANOR 元素,如果存在则只获取“1st”,否则为“2nd”,否则为“3rd”。现在,如果数组不包含 FELONY 元素,那么我想拉“第一个”MISDEMEANOR 元素(如果存在),否则为“第 2 个”,否则为“第 3 个”。

我的解决方案:

var arr = [ ["1st", "FELONY"], ["3nd", "FELONY"], ["2nd", "FELONY"], ["2nd", "MISDEMEANOR"], ["3rd", "MISDEMEANOR"], ["1st", "MISDEMEANOR"]];
for(var i = 0, found = [], fel1 = false, fel2 = false, fel3 = false, mis1 = false, mis2 = false, mis3 = false; i < arr.length; i++) {
   if(arr[i][0] == "1st" && arr[i][1] == "FELONY"){
       found = arr[i];
       fel1 = true;
   } else if (arr[i][0] == "2nd" && arr[i][1] == "FELONY" && !fel1){
       found = arr[i];
       fel2 = true;
   } else if (arr[i][0] == "3rd" && arr[i][1] == "FELONY" && !fel1 && !fel2){
       found = arr[i];
       fel3 = true;
   } else if (arr[i][0] == "1st" && arr[i][1] == "MISDEMEANOR" && !fel1 && !fel2 && !fel3){
       found = arr[i];
       mis1 = true;
   } else if (arr[i][0] == "2st" && arr[i][1] == "MISDEMEANOR" && !fel1 && !fel2 && !fel3 && !mis1){
       found = arr[i];
       mis2 = true;
   } else if (arr[i][0] == "3st" && arr[i][1] == "MISDEMEANOR" && !fel1 && !fel2 && !fel3 && !mis1){
       found = arr[i];
       mis3 = true;
   }
}


if( match && (match[2] == "FELONY" || match[2] == "MISDEMEANOR") && (found[2] != "FELONY" && found[1] != "1st") ) {
            found = [ match[1], match[2], match[3], match[4] ]
            console.log("FOUND! " + found[1]);
} else {
            console.log(`could not parse ${chargesList[i]}`);
}

console.log(JSON.stringify(found));

它完成了工作,但有点草率。有没有更好的方法来使用 EcmaScript 6 功能来做到这一点?

标签: javascriptarraysalgorithmdata-structuresecmascript-6

解决方案


一个非常简单的版本是:

function mySort(a) {
  return [...a].sort(([aa, ab], [ba, bb]) => (ab + aa).localeCompare(bb + ba))
}

然后像这样使用它:

const [selected] = mySort(arr)

需要注意的几点:

  • 我们需要[...a]复制数组,因为sort它操作的数组会发生变异
  • 这只有效,因为FfromFELONY出现在MfromMISDEMEANOR和 your之前1st2nd并且3rd以数字开头
  • 这不是一种高效的方法,但在你的情况下它可能没问题

如果您确实需要其他字符串进行排序,您可以使用查找表:

const lookup = {
  FELONY: 1,
  MISDEMEANOR: 2,
  ...
}

sort(... => (lookup[ab] + lookup[aa]).localeCompare(...))

推荐阅读