【问题标题】:Filter array in object with multiple condition具有多个条件的对象中的过滤器数组
【发布时间】:2021-12-10 15:21:48
【问题描述】:

我正在做一个搜索功能,用户将在过滤器对象中输入该选项,然后他们将获得他们想要的列表。 所以我有一个这样的数组

let array = [
  {
    "id": 1,
    "form_items": [
      {
        "value_text": "test",
        "header_id": 1,
        "value_number" 2000
      },
      {
        "value_text": "test 2",
        "header_id": 2,
        "value_number" null
      }
    ]
  },
  {
    "id": 2,
    "form_items": [
      {
        "value_text": "test 3",
        "header_id": 3,
        "value_number": 1000
      }
    ]
  }
]

我有一个像这样的过滤器对象

let filter = {
    "value_text": "test 2",
    "value_number": 2000
}

如何根据我的过滤器对象返回我的数组,form_items 数组中的元素与条件匹配例如:“header_id”中的“test 2”:2 和“header_id”中的 2000:1

所以我的结果会是这样的

[
  {
    "id": 1,
    "form_items": [
      {
        "value_text": "test",
        "header_id": 1,
        "value_number" 2000
      },
      {
        "value_text": "test 2",
        "header_id": 2,
        "value_number" null
      }
    ]
  }
]

【问题讨论】:

  • 所以您想将数组中的所有元素与符合您条件的表单项进行匹配?如果第一个 Obj 中有第三个元素怎么办?你想展示整个对象,还是只展示匹配的 form_items?
  • 是的,我只想用我的标准过滤每个对象中的 form_items。

标签: javascript arrays object filter


【解决方案1】:

你可以用几个循环来做到这一点,但它可以放入更小的函数中。

var results = [];

for(const element of array){
    // 1. Find all formItems that are matching your filter for each element
    let matchingFormItems = []; // create an result array of formItems matching your filter criteria
    for(const formItem of array['form_items']){  // iterate over all form_items
       for(let filterKey: Object.keys(filter)){ // for each filter key, check if current formItem matches filter criteria
         if(filter[filterKey] === formItem[filterKey]){ // if filter key is matching property from the formItem, push it to result Array
            matchingFormItems.push(formItem);
            break;// if one filter is matching, you can skip other
         }
      }

    }

  // 2. If at least one formItem has been found - push new object to the result array
  if(matchingFormItems.length > 0 ){
     results.push({ // it's best not to mutate input array, so we need to clone the object with only desired formItems.
         'id': element.id,
         'form_items': matchingFormItems
     });
 }
}

【讨论】:

    猜你喜欢
    • 2021-07-05
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2019-03-02
    • 1970-01-01
    相关资源
    最近更新 更多