首页 > 解决方案 > 过滤对象的对象动态键值

问题描述

如何在 javaScript 或 lodash 中过滤具有动态键值的对象的对象。

我的数据是:

var names = [
  {
    name: 'c1',
    tags: {
      key1: 'value1-1',
      key2: 'value1-2',
    },
  },
  {
    name: 'c2',
    tags: {
      key1: 'value2-1',
      key2: 'value1-2',
    },
  },
  {
    name: 'c3',
    tags: {
      key3: 'value3-1',
      key4: 'value3-2',
    },
  }
]

和过滤数据是:

var filterData = {
  key3: { 0: 'value3-1' },
  key4: { 0: 'value3-2' }
}

我希望过滤器和过滤器后显示如下:

afterFilter = [
      {
        name: 'c3',
        tags: {
          key3: 'value3-1',
          key4: 'value3-2',
        }
      }
    ]

标签: javascriptlodash

解决方案


第一个 console.log 段:
- 过滤器在标签中包含键/值
第二个 console.log 段:
- 完全相同的键/值集(也检查它们的长度相同)

var names = [{
    name: 'c1',
    tags: {
      key1: 'value1-1',
      key2: 'value1-2',
    },
  },
  {
    name: 'c2',
    tags: {
      key1: 'value2-1',
      key2: 'value1-2',
    },
  },
  {
    name: 'c3',
    tags: {
      key3: 'value3-1',
      key4: 'value3-2',
    },
  }
]
var filterData = {
  key3: 'value3-1',
  key4: 'value3-2'
}

names.push({
  name: 'c4',
  tags: {
    key1: 'pew',
    key2: 'pew pew',
    key4: 'value3-2',
    key3: 'value3-1'
  }
})

// filter for if _contains_ key/values of filterData
console.log(
  names.filter(({
    tags
  }) => Object.entries(filterData).every(([k, v]) => tags[k] === v))
)

// filter for only exact same key/values of filterData order-insensitive
const count = Object.keys(filterData).length
console.log(
  names.filter(
    ({
      tags
    }) =>
    (tags =>
      tags.length === count && tags.every(([k, v]) => filterData[k] === v))
    (Object.entries(tags))
  )
)


推荐阅读