使用React过滤列表

时间:2017-04-26 20:24:25

标签: javascript arrays reactjs filtering

嗯,我没有看到我的疏忽,但是我得到一个空白页面,控制台错误说:

Users.js:9 Uncaught TypeError: Cannot read property 'filter' of undefined
    at Users.render (Users.js:9)

显然我正在使用' filter()'不当。我环顾四周,但没有找到任何东西' React'有关。有人可以帮忙吗?以下是文件:

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>React App</title>
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import Users from './Users';

ReactDOM.render(
  <Users list={[
    { name: 'Tyler', friend: true },
    { name: 'Ryan', friend: true },
    { name: 'Michael', friend: false },
    { name: 'Mikenzie', friend: false },
    { name: 'Jessica', friend: true },
    { name: 'Dan', friend: false }
    ]}
  />,
  document.getElementById('root')
);

Users.js

import React from 'react';

class Users extends React.Component {
  render() {
    return (
      <div>
        <h1>Friends:</h1>
        <ul>
          {this.props.list.friend.filter(function (friend) {
            return <li>{friend[0] === 'true'}</li>
        })}
        </ul>

        <hr />

        <h1>Non Friends:</h1>
        <ul>
          {this.props.list.friend.filter(function (nonFriend) {
            return <li>{nonFriend[0] === 'false'}</li>
          })}
        </ul>
      </div>
    );
  }
}

export default Users;

5 个答案:

答案 0 :(得分:4)

当您的数组中的每个对象都属性时,您正在列表中调用.friend。您也在使用.filter,但我认为您在这里没有正确使用它。 .filter将返回一个包含某些元素的数组,其中传入的函数返回一个truthy值。以下是.filter

的方法
var nonFriends = this.props.list.filter(function (user) {
  return !user.friend;
});

var friends = this.props.list.filter(function (user) {
  return user.friend;
});

return (
  <div>
    <h1>Friends:</h1>
    <ul>{ friends }</ul>
    <h1>Non Friends:</h1>
    <ul>{ nonFriends }</ul>
  </div>
);

如果数组很大,你也可以在数组中传递.forEach

var nonFriends = [], friends = [];

this.props.list.forEach(function (user) {
  if (user.friend) {
    friends.push(user);
  } else {
    nonFriends.push(user);
  }
});

// now render friends and nonFriends

答案 1 :(得分:4)

好的,看起来像“Users.js”应该是:

import React from 'react';

class Users extends React.Component {
  render() {
    let friends = this.props.list.filter( function (user) {
      return user.friend === true
    });

    let nonFriends = this.props.list.filter( function (user) {
      return user.friend !== true
    });

    return (
      <div>
        <h1>Friends:</h1>
        <ul>
          {friends.map(function (user) {
            return <li key={user.name}>{user.name}</li>
          })}
        </ul>
        <h1>Non Friends:</h1>
        <ul>
          {nonFriends.map(function (user) {
            return <li key={user.name}>{user.name}</li>
          })}
        </ul>
      </div>
    );
  }
}

export default Users;

甚至这个:

import React from 'react';

class Users extends React.Component {
  render() {
    return (
      <div>
        <h1>Friends:</h1>
        <ul>
          {this.props.list.filter(function (user) { // filter first for friends
            return user.friend === true // returns a new array
          }).map(function (user) {  // map the new array to list items
            return <li key={user.name}>{user.name}</li> // don't forget unique key for each item
          })}
        </ul>

        <hr />

        <h1>Non Friends:</h1>
        <ul>
          {this.props.list.filter(function (user) { // filter first for non-friends
            return user.friend !== true // returns a new array
          }).map(function (user) {  //map the new array to list items
            return <li key={user.name}>{user.name}</li> // don't forget unique key for each item
          })}
        </ul>
      </div>
    );
  }
}

export default Users;

答案 2 :(得分:2)

我认为您正在尝试过滤属性,而不是列表。试着改变这个:

this.props.list.friend.filter

到此:

this.props.list.filter

答案 3 :(得分:2)

我会做这样的事情而不是更直接

{this.props.list.map(function (person, i) {
  {return person.friend
    ?(<li key={i}>{person.name}</li>)
    : null
  }
})}
  1. 您正在遍历列表本身,而不是列表中的项目,这就是this.props.list.friend.filter无效的原因。
  2. 我会使用map,因为在这种情况下你实际上并没有过滤列表。如果您愿意,您可以事先将列表过滤到朋友和非朋友,并映射那些实际上更容易让其他工程师看到的项目。
  3. React希望在标记中为创建的迭代项目添加key个。这就是React如何在状态树中创建组件之间的关系。

答案 4 :(得分:-2)

  {items.filter((product) => {
                    if (searchterm === "") {
                        return product
                    }
                    else if (product.title.toLowerCase().includes(searchterm.toLocaleLowerCase())) {
                        return product
                    }

                })