Получить отфильтрованные значения из вложенного объекта JavaScript

#javascript #vue.js #dictionary #object

#javascript #vue.js #словарь #объект

Вопрос:

У меня есть список объектов с каждым объектом формы:

 {
  "myFilters": [
    {
      "isMatch": false,
      "filters": [
        {
          "id": "aaaaaa",
          "version": "v1"
        },
        {
          "id": "kk",
          "version": "v1"
        }
      ]
    }
  ],
  "randomAttr1": null,
  "randomAttr2": []
}
  

Предположим, что приведенное выше является объектом из списка объектов, хранящихся result в.

Теперь я хочу получить список всех версий и добавить его обратно в этот объект в качестве значения нового элемента relevant_versions , но с условием, что идентификатор и версия должны быть в параметрах URL. Вот моя попытка:

   for (let f of result) {
    f.relevant_versions = f.myFilters.filter(x=>x.filters    
    .filter(item=>(item.id == this.$route.params.filterId amp;amp; item.version == this.$route.params.version))
    .map(fid => fid.version))
  }
  

Но вместо этого у меня есть весь myFilters элемент, а не только версии. Я думаю, что я близок и совершаю здесь простую ошибку.

Как я могу соответствующим образом заполнить relevant_versions здесь?

Редактировать: таким образом, вывод будет выглядеть так

 {
  "myFilters": [
    {
      "isMatch": false,
      "filters": [
        {
          "id": "aaaaaa",
          "version": "v1"
        },
        {
          "id": "kk",
          "version": "v1"
        }
      ]
    }
  ],
  "randomAttr1": null,
  "randomAttr2": [],
  "relevant_versions":["v1", "v1"]
}
  

Пример маршрута localhost:8080/filters/kk/v1 . Здесь kk соответствует this.$route.params.filterId и v1 this.$route.params.version .

Комментарии:

1. Не могли бы вы привести несколько примеров результатов, которые вы хотите? Также включите параметры маршрута, которые приведут к этим результатам

2. @Phil я внес изменения.

3. Почему должно быть две v1 записи? Соответствует только один фильтр filterId ?

Ответ №1:

Вы не хотите фильтровать myFilters объект, а вместо этого (плоско) сопоставлять значения внутри с соответствующими версиями

 const result = [{"myFilters":[{"isMatch":false,"filters":[{"id":"aaaaaa","version":"v1"},{"id":"kk","version":"v1"}]}],"randomAttr1":null,"randomAttr2":[]}]

this.$route = {params:{filterId:"kk",version:"v1"}}

// this avoids mutating `results`
const modifiedResult = result.map(f => ({
  ...f,
  relevant_versions: f.myFilters.flatMap(({ filters }) =>
    filters.filter(({ id, version }) =>
      id == this.$route.params.filterId amp;amp; version == this.$route.params.version
    ).map(({ version }) => version)
  )
}))

console.info(modifiedResult)  
 .as-console-wrapper { max-height: 100% !important; }  


Если вы хотите мутировать result , замените верхний уровень map на a forEach или используйте for..of цикл, как в вашем вопросе

 result.forEach(f => {
  f.relevant_versions = f.myFilters.flatMap(...)
})

// or

for (let f of result) {
  f.relevant_versions = f.myFilters.flatMap(...)
}