【问题标题】:Check if an item exist in array and remove that particular item from that array检查数组中是否存在某个项目并从该数组中删除该特定项目
【发布时间】:2016-07-18 09:30:00
【问题描述】:

我有一个显示标签列表的组件,用户可以选择标签来关注它们。所以当用户点击一个标签时,我想把它存储在tagsSelectedList中并添加一个新的类名selected_tag。但如果标签已经存在于 tagsSelectedList 中,请从 tagsSelectedList 中删除该标签,同时删除类名 selected_tag

我很困惑如何检查标签对象是否存在于 tagSelectedList 中并从列表中删除该特定标签项。我怎么做?您的帮助和指导将不胜感激。谢谢。

component.js:

let tags = [
    {id: "1", tagName: "Arts"},
    ...
    ...
    {id: "59", tagName: "Writing"}
];
var tagsSelectedList = [];

export default class SignUpSubscribeTags extends React.Component {
    constructor(props){
        super(props);
    }
    selectTag = (e) => {

        // if the tag is not present in the tagsSelectedList then add the tag in the tagsSelectedList also add the tag_selected class name
        var isTagPresent = tagsSelectedList.filter(function(item) {
           return item.id === e.target.dataset.pk
        });

        if(isTagPresent) {
            console.log(e.target.dataset.pk, 'present in tagsSelectedList');
        }
        else {
            console.log(e.target.dataset.pk, 'not present in tagsSelectedList');
        }

        // if the tag is present in tagsSelectedList then remove the tag object from the tagsSelectedList also remove the tag_selected class name

    }

    render() {
        let tagList = tags.map((Tag) => {
            return (
                <li id={Tag.tagName} class="tag" data-pk={ Tag.id } key={Tag.id} onClick={this.selectTag}>{Tag.tagName}</li>
            );
        });

        return(
            <div id="signup-process-wrapper-addTags">

                <div id="add_tags">
                    <ul id="tag_list">
                        {tagList}
                    </ul>
                </div>
            </div>
        );
    }
}

【问题讨论】:

标签: javascript arrays object reactjs


【解决方案1】:

您可以通过以下方式检查taglist是否包含项目:

    if (e.target.className.indexOf("tag_selected") > -1) {}

    var isTagPresent = tagsSelectedList.filter(function(item) {
       return item.id === e.target.key
    });
    if(isTagPresent.length) {}

您可以通过以下方式删除课程:

    e.target.className.replace("tag_selected", "");

您可以通过

删除项目
    tagsSelectedList = tagsSelectedList.filter(function(item) {
       return item.id !== e.target.key
    })

【讨论】:

  • e.targert 上有一个小错字;)
  • @VincentTaing 谢谢 :)
  • 我让isTagPresent 始终正确。我已经稍微更改了代码。请检查一下。
  • 啊!有一个错误很好,这让我学到了更多。谢谢你。虽然,e.target.className.replace("tag_selected", ""); 不起作用,我不得不这样做e.target.className="tag";。再次感谢。
【解决方案2】:

既然你在使用 React,为什么不创建一个自动添加/删除类的表达式。

将变量添加到状态并基于值切换类。

export default class SignUpSubscribeTags extends React.Component {
    constructor(props){
        super(props);
        this.state = {
          isSelected: false
        }
    }

    selectTag = (e) => {
      this.setState({
        isSelected: !this.state.isSelected
      })
    }

    render() {
        let tagList = tags.map((Tag) => {
            return (
                <li 
                  id={Tag.tagName} 
                  class="tag" 
                  className={this.state.isSelected? ' tag_selected ' : null} 
                  key={Tag.id} 
                  onClick={this.selectTag}>
                  {Tag.tagName}
                </li>
            );
        });

        return(
            <div id="signup-process-wrapper-addTags">
                <div id="add_tags">
                    <ul id="tag_list">
                        {tagList}
                    </ul>

                </div>
            </div>
        );
    }
}

【讨论】:

  • 你没有明白我的意思。我不想将tag_selected 添加到所有标签,只添加到点击的标签。随着您的实施,所有标签都将被选中。
  • @Benjamin 这只是一个示例实现。由于您有一个循环,因此您将为所有 lis 选择值,并且根据当前标志的值,您必须添加类。回答的目的是表明你可以在 React 本身中实现,你不需要在 JS 中手动添加类。
猜你喜欢
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 2021-07-23
  • 2017-12-29
  • 2020-10-01
  • 1970-01-01
  • 2020-02-22
  • 1970-01-01
相关资源
最近更新 更多