#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(...)
}