【问题标题】:Get filtered values from nested object JavaScript从嵌套对象 JavaScript 中获取过滤值
【发布时间】:2020-10-28 03:44:52
【问题描述】:

我有一个对象列表,其中包含表单的每个对象:

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

假设以上是存储在result中的对象列表中的一个对象。

现在我想获取所有 版本 的列表并将其作为新元素 relevant_versions 的值添加回此对象,但条件是 Id 和版本必须在网址参数。这是我的尝试:

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

但我有整个 myFilters 元素,而不是只有版本。我想我很接近并在这里犯了一个简单的错误。

如何在此处适当地填充相关版本?

编辑:所以输出看起来像

{
  "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.filterIdv1对应this.$route.params.version

【问题讨论】:

  • 你能举一些你想要的结果的例子吗?还包括会产生这些结果的路由参数
  • @Phil 我已经进行了编辑。
  • 为什么会有两个v1 条目?只有一个 filter 匹配 filterId?

标签: javascript vue.js dictionary object


【解决方案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 && version == this.$route.params.version
    ).map(({ version }) => version)
  )
}))

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

如果您确实想改变 result,则将顶级 map 替换为 forEach 或使用 for..of 循环,就像在您的问题中一样

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

// or

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

【讨论】:

    猜你喜欢
    • 2021-01-15
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2020-02-01
    • 2018-10-14
    相关资源
    最近更新 更多