基于多个值过滤嵌套数组

时间:2021-05-14 14:54:27

标签: javascript arrays filter include

我有一个如下所示的嵌套数组:

var nested_array = [
  ["18081163__,0,0.15,15238", "0", "0.15", "Somerset", "Local", "Norfolk Road"], 
  ["18081165__,0.7,0.25,15239", "0", "0.15", "Somerset", "State", "Norfolk Road"], 
  ["18081153__,0.1,0.25,15240", "0.1", "0.25", "Cumberland", "Local", "Potter Terrace"], 
  ["18081164__,1.1,2.25,15241", "1.1", "2.25", "Cumberland", "State", "Jones Street"]
]

在每个子数组中,索引 3 = 县,索引 4 = 道路类型,索引 5 = 道路名称。在我的应用程序中,用户必须选择 road_name。我创建了一个简单的函数,它接受值并返回一个嵌套数组,其中包含包含该值的子数组:

function array_parser(old_array, key_word) {
    let new_array = [];
    for (let i = 0; i < old_array.length; i++) {
        if (old_array[i].includes(key_word)) {
            new_array.push(old_array[i]);
        }
    }
    return new_array;
}

这适用于单个值,但我希望用户也能够选择县和 road_type。如果他们这样做,我想成为一个过滤器并返回一个基于值列表/数组的数组:

 key_words = ["Somerset", "Norfolk Road"] 

key_words = ["Somerset", "Local", "Norfolk Road"]

如何实现?

1 个答案:

答案 0 :(得分:2)

  • 您可以创建一个接受关键字数组和需要比较条件的数组的函数。
    • 它应该能够使用 Array#every 迭代每个关键字,其中谓词回调函数使用 Array#includes 来针对每个迭代的关键字进行比较数组。
  • 您可以修改 array_parser 函数以接受嵌套数组数组和关键字数组。
    • 您可以使用 Array#filter,其中谓词回调函数将使用之前创建的匹配器函数来匹配关键字条件。

function matcher(array1, array2) {
  return array1.every(value => array2.includes(value));
}

function array_parser(array, keywords) {
  return array.filter(values => matcher(keywords, values));
}

var nested_array = [
  ["18081163__,0,0.15,15238", "0", "0.15", "Somerset", "Local", "Norfolk Road"],
  ["18081165__,0.7,0.25,15239", "0", "0.15", "Somerset", "State", "Norfolk Road"],
  ["18081153__,0.1,0.25,15240", "0.1", "0.25", "Cumberland", "Local", "Potter Terrace"],
  ["18081164__,1.1,2.25,15241", "1.1", "2.25", "Cumberland", "State", "Jones Street"]
];

function matcher(array1, array2) {
  return array1.every(value => array2.includes(value));
}

function array_parser(array, keywords) {
  return array.filter(values => matcher(keywords, values));
}

let keywords = ["Somerset", "Norfolk Road"];
console.log('keywords =', keywords);
console.log(array_parser(nested_array, keywords));


keywords = [ "Somerset", "Local", "Norfolk Road"];
console.log('keywords =', keywords);
console.log(array_parser(nested_array, keywords));
.as-console-wrapper{top: 0; max-height: unset !important;};