【问题标题】:Why is this array not empty?为什么这个数组不为空?
【发布时间】:2023-03-08 11:11:01
【问题描述】:

我试图在 Vue 的过滤方法中显示数组中的消息为空。 但是,似乎我的计算函数仍然返回一个空对象数组(如果我搜索不存在的东西)

我希望它只返回实际具有值的对象 - 应该过滤掉空的对象?

所以如果我搜索“fjhdsfjsdfjsd”ex,它仍然返回大约 200 个项目,只是空对象,它不应该返回吗?

计算函数如下:

filteredAlarms: function () {

    let filter = {};
    let searchString = this.search_string.toLowerCase();

    Object.keys(this.eventLog).forEach(key => {
      filter[key] = this.eventLog[key].filter(item => {
        let systemName = item.system_name.toLowerCase();
        if(item.type.includes("alarm") && systemName.includes(searchString)) {
          return item;
        }
      });
    });

    return filter

  },

【问题讨论】:

  • 注意.filter 回调应该返回一个布尔值。总是。有时不是一个项目,有时是未定义的。
  • 你能提供一些示例输入和你得到的输出吗?您的代码应该返回一个空数组对象,而不是相反。

标签: javascript ecmascript-6 vue.js


【解决方案1】:

Array.prototype.filter 必须返回一个布尔值。只需删除 ifreturn item 部分,然后返回您的 if 条件:

filteredAlarms: function () {
  let searchString = this.search_string.toLowerCase();
  let eventKeys = Object.keys(this.eventLog);

  return eventKeys.reduce((filter, key) => {

    let items = this.eventLog[key].filter(item => {
      let systemName = item.system_name.toLowerCase();
      return item.type.includes("alarm") && systemName.includes(searchString);
    });

    return Object.assign(filter, { [key]: items });
  }, {});
}

【讨论】:

    【解决方案2】:

    试试这个。我希望这会奏效。

    filteredAlarms: function () {
    
        let filter = {};
        let searchString = this.search_string.toLowerCase();
    
        Object.keys(this.eventLog).forEach(key => {
          filter[key] = this.eventLog[key].filter(function(item){
            return item.type.includes("alarm") && item.system_name.toLowerCase().includes(searchString);
          });
        });
    
        return filter
    
      },
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      相关资源
      最近更新 更多