【问题标题】:ReactJS - Search/Iterate through array of objectsReactJS - 搜索/迭代对象数组
【发布时间】:2026-02-18 04:45:01
【问题描述】:

我有一个这样的对象:

{
  "data": [
    {
      "id": "1234",
      "is_deleted": false,
      "name": "Sarah"
    },
    {
      "id": "3520",
      "is_deleted": true,
      "name": "Bobby"
    },
    {
      "id": "3520",
      "is_deleted": true,
      "name": "Sartah"
    }
  ]
}

反应代码

import React from 'react';
import { Input } from 'antd';
import { connect } from 'dva';

const Search = Input.Search;

@connect(({ rule, loading }) => ({
  rule,
  loading: loading.models.rule,
}))

export default class SearchBox extends React.Component {
    constructor(props) {
        super(props)
        this.state = {
            isListLoaded: false,
            resultArr: {}
        }
    }

    performSearch(value) {
    for( var i = this.props.rule.data.list.length; i--; ) {
        for (var key in this.props.rule.data.list[i]) {
            this.setState({resultArr: this.state.resultArr.push(i)});
            }
    }
    }

    componentDidMount() {
        if (!this.state.isListLoaded) {
            const { dispatch } = this.props;
            dispatch({
                type: 'rule/fetch'
            });
            this.setState({ isListLoaded: true });
    }
  }

  render() {
    return (
      <div>
           <Search
            placeholder="Search..."
                    onChange={(event) => this.performSearch(event.target.value)}
            style={{ width: "250px", "margin-left": "20px"}}
          />
      </div>
    );
  }
}

我的目标很简单:我想搜索这个对象,并且 返回包含关键字的整个数组。

示例:如果我搜索“Sar”,我应该得到 2 个对象:

{
  "id": "1234",
  "is_deleted": false,
  "name": "Sarah"
},
{
  "id": "3520",
  "is_deleted": true,
  "name": "Sartah"
}

问题是,我在尝试此代码时遇到错误。我确实在 SO 上搜索了此问题的先前解决方案,但我只能找到仅返回一个元素的示例。我想要的是获得 ALLANY 属性中包含关键字的结果(在本例中,我返回 2 个元素,而不仅仅是一个)

有什么想法吗?

【问题讨论】:

    标签: javascript arrays reactjs


    【解决方案1】:

    const { data } = {
      "data": [
        {
          "id": "1234",
          "is_deleted": false,
          "name": "Sarah"
        },
        {
          "id": "3520",
          "is_deleted": true,
          "name": "Bobby"
        },
        {
          "id": "3520",
          "is_deleted": true,
          "name": "Sartah"
        }
      ]
    };
    
    const keyword = "Sar";
    
    const filtered = data.filter(entry => Object.values(entry).some(val => typeof val === "string" && val.includes(keyword)));
    
    console.log(filtered);

    它使用以下标准过滤数据数组的entries:至少一个条目的值必须包含给定的关键字。

    由于 IE 尚不支持 Object.values()String.prototype.includes(),您可以使用以下内容:

    const containsKeyword = val => typeof val === "string" && val.indexOf(keyword) !== -1;
    
    const filtered = data.filter(entry => Object.keys(entry).map(key => entry[key]).some(containsKeyword));
    

    或者 polyfill 这些 ES6 特性,查看更多 here

    要使keyword 查找不区分大小写,您可以使用RegExp

    const re = new RegExp(keyword, 'i');
    const filtered = data.filter(entry => Object.values(entry).some(val => typeof val === "string" && val.match(re)));
    

    【讨论】:

    • 请注意,Object.valuesString.includes 在 IE 中不受支持。
    • 知道如何使它不区分大小写吗?
    【解决方案2】:

    简单地使用javascript的过滤方法而不是循环遍历数组

       performSearch(value) {
       const unfilteredData = this.props.rule.data.list;
       const filteredDate = unfilteredData.filter((val) => {
         return val.name.indexOf(val) !== -1;
       });
       this.setState({
          resultArr: filteredDate,
        })
      }
    

    【讨论】:

      【解决方案3】:
      performSearch(value) {
          let filteredData = this.props.rule.data.list.filter(item => {
              let isFiltered = false;
              for(let key in item){
                  if(item[key].includes(value)){
                      isFiltered = true;
                  }
              }
              return isFiltered;
          })
          this.setState({resultArr: filteredData});
      }
      

      【讨论】:

      • 能否请您在代码中添加解释,以便提问者(和未来的读者)知道为什么会出现问题,并知道如何解决它。
      • if(item[key].includes 将抛出非字符串。