【问题标题】:Filtering nested arrays based on multiple values基于多个值过滤嵌套数组
【发布时间】:2021-08-04 18:03:11
【问题描述】:

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

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 = road_type,索引 5 = road_name。在我的应用程序中,用户必须选择 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;
}

这适用于单个值,但我希望用户也可以选择县和道路类型。如果他们这样做,我想成为一个过滤器并根据值列表/数组返回一个数组:

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

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

如何做到这一点?

【问题讨论】:

  • 快速提问,这些关键字没有约束吗?如果真的有一条与州同名的道路呢?这也是解析数组中的有效包含吗?
  • 因此,对于 road_type(索引 4),它们基于有限的下拉列表或选择:[州、本地、州际、其他]。 road_names(索引 5)都将有 Road、Street、Lane 等......或者会像 US-95 或其他东西,所以即使道路名称是“State Street”,道路类型是“State”,我认为这不是问题(尽管也许我错了。

标签: javascript arrays filter include


【解决方案1】:
  • 您可以创建一个函数来接受关键字数组和需要比较条件的数组。
    • 它应该能够使用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;};

【讨论】:

  • 这是一个很棒的精简解决方案。效果很好!
猜你喜欢
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 2020-07-04
  • 2018-08-23
  • 1970-01-01
  • 2022-08-13
  • 2019-08-27
相关资源
最近更新 更多