【问题标题】:Vue JS real-time search on object's key/value pairsVue JS 实时搜索对象的键/值对
【发布时间】:2021-08-21 13:47:40
【问题描述】:

我正在使用 Vue JS 2 作为我的 Nuxt JS 项目的一部分来构建一个实时搜索过滤器,用户可以开始输入并根据他们输入的内容匹配结果。

我有一个搜索输入,以字符串的形式绑定到 applicantModalSearch 的模型,并在 applicantModalData 中保存了一个带有键/值对的对象。

applicantModalData 内部的数据是未知的,并且最初不会在页面加载时填充,它是作为用户从 v-for 元素中选择的一部分进行更新的,即:用户单击按钮以在模式中预览数据,并且该v-for 项的索引项被添加到applicantModalData

我希望能够动态搜索键和值,而不仅仅是值并返回结果,现在我的错误是:

this.applicantModalData.filter 不是函数

export default {
  data () {
    return {
      applicantModalIsShown: false,
      applicantModalData: null,
      applicantModalSearch: ''
    }
  },
  methods: {

    /*
    ** Applicant modal data
    */
    toggleApplicantModal (applicant) {
      this.applicantModalData = applicant ?? null
      this.applicantModalIsShown = !this.applicantModalIsShown
    }

  },
  computed: {

    /*
    ** Filter applicant data for ease
    */
    filteredApplicantData () {
      if (this.applicantModalSearch) {
        return this.applicantModalData.filter((item) => {
          return this.applicantModalSearch.toLowerCase().split(' ').every(v => item.toLowerCase().includes(v))
        })
      } else {
        return this.applicantModalData
      }
    }

  }
}

我需要过滤和返回的示例对象可能是:

{
  "_method": "POST",
  "honey_key": "test",
  "honey_version": null,
  "client_user_agent_string": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1",
  "application_source_url": "https://example.com/",
  "IsIframe": "1",
  "AppFirstName": "John",
  "AppLastName": "Doe"
}

因此,如果我在搜索元素 (applicantModalSearch) 中输入类似“John”的内容,我希望从我的计算属性中得到:

{
  "AppFirstName": "John",
}

或者如果我在搜索元素中输入“姓氏”,我希望看到:

{
  "AppLastName": "Doe"
}

我的代码中缺少什么?

更新

所以实施后:

filteredApplicantData() {
  if (this.applicantModalSearch) {
    return Object.fromEntries(
      Object.entries(this.applicantModalData).filter(([key, value]) => {
        if (value == null) value = 'null'
        return this.applicantModalSearch
          .toLocaleLowerCase()
          .split(" ")
          .every(
            (word) =>
              key.toLocaleLowerCase().includes(word) ||
              value.toLocaleLowerCase().includes(word)
          );
      })
    );
  }
  return this.applicantModalData;
},

并添加更多数据,奇怪的是代码会失败并且只会到达列表中的client_user_agent_string(我添加了更多数据)

对象中可能有奇怪的字符吗?

最终更新

原来需要以下内容来解析和完成作为Object.entries部分的一部分的功能:

if (value == null) value = 'null'

【问题讨论】:

  • 在您的更新中...听起来您遇到了典型的反应性问题:vuejs.org/v2/guide/reactivity.html#For-Objects
  • @Terry 谢谢特里,所以客户端用户代理字符串中没有什么奇怪的,然后导致它中断?我该如何解决这个问题?
  • 如果您要向this.applicantModalData 添加新的键值对,请使用Vue.setvuejs.org/v2/api/#Vue-set
  • Vue.set 不能作为 Nuxt JS 应用程序的一部分使用。此外,在搜索时,applicantModalData 内的所有 99 个键/值对都可用,但它只到达第四项,即客户端用户代理字符串,为什么此时会失败?

标签: javascript vue.js nuxt.js


【解决方案1】:

我按照您的逻辑比较值,但将它们应用于键和值。我在您提供的示例上对其进行了测试。

computed: {
    filteredApplicantData() {
      if (this.applicantModalSearch) {
        return Object.fromEntries(
          Object.entries(this.applicantModalData).filter(([key, value]) => {
            return this.applicantModalSearch
              .toLocaleLowerCase()
              .split(" ")
              .every(
                (word) =>
                  key.toLocaleLowerCase().includes(word) ||
                  value.toLocaleLowerCase().includes(word)
              );
          })
        );
      }
      return this.applicantModalData;
    },
  },

一些解释:Object.entries 将给定对象的键值对数组作为数组 [key, value] 返回。这允许我们在该数组上进行迭代/过滤,并使用相反的方法Object.fromEntries 重构对象。

【讨论】:

  • 这看起来很不错,除了我在 Locale 部分遇到错误:“无法读取属性 'toLocaleLowerCase' of null”,您是否在某处缺少括号?
  • 我觉得最后少了一个括号,我又贴了一遍代码
  • 仍然收到错误Cannot read property 'toLocaleLowerCase' of null,当我在控制台中单击错误时,它会突出显示(word) => 行 - 我已经检查过applicantModalSearch 有一个值,并且确实如此,并且applicantModalData 在运行代码之前包含一个对象,并且确实存在,缺少什么?
  • 将 'toLocaleLowerCase' 更改为 'toLowerCase' 也许,我认为自动完成将'Locale' 添加到我的代码中
猜你喜欢
  • 2011-11-26
  • 2012-01-20
  • 1970-01-01
  • 2021-03-12
  • 1970-01-01
  • 2015-07-10
  • 2020-02-08
  • 1970-01-01
  • 2021-08-31
相关资源
最近更新 更多