javascript - 根据数组元素从数组中提取元素

标签 javascript arrays algorithm data-structures ecmascript-6

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

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

所以它可能是这样的:

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

或者这个:

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

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

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

我的解决方案:

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 功能来做到这一点?

最佳答案

理想情况下,您只想遍历数组一次,如果可能的话,避免使用巨大的 if/else if 字符串。一种方法是使用一个系统,该系统允许您为每个项目制作唯一的分数,其中最高分是您想要的项目。有很多方法可以做到这一点,但一个简单的方法是为 felonymisdemeanor 分配数字,这样它们保证在第二个维度上更大。重罪/轻罪排在第 10 位,第 1、第 2、第 3 位占据第 1 位。然后你可以查看你的数组一次并找到最高分:

let scores = {
  FELONY: 20,
  MISDEMEANOR: 10,
  '1st': 3,
  '2nd': 2,
  '3rd': 1
}

let arr = [["2nd", "FELONY"],["2nd", "MISDEMEANOR"], ["1st", "MISDEMEANOR"],["1st", "FELONY"]]

let highest = 0, result
for (item of arr) {
  let score = item.reduce((a, c) => a + scores[c], 0)
  if (score > highest) {
    highest = score
    result = item
  }
}
console.log(result)

这也使得编辑您的偏好或添加不同的类别变得非常容易,并且它不依赖于您的类别的字母排序顺序。

关于javascript - 根据数组元素从数组中提取元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51236785/

相关文章:

java - 如何打印数组的元素

algorithm - 仿射变换算法

c# - 简单的正交图边路由算法

javascript - React-Native 在构建时找不到主项目文件

javascript - jQuery 循环遍历 PHP 数组的对象

Javascript 选择更改不会第一次尝试触发

c++ - 如何初始化多种类型对象的自动类型数组

c++ - UTF-8 字符串的简单加密,结果是 NULL 终止字符串?

javascript - IntersectionObserver : how rootMargin work?

javascript - Canvas 漫画的自定义光标?