将子类别映射到父类别

时间:2017-06-30 01:11:38

标签: javascript reactjs

我将返回类别和子类别的数据,数据将通过以下方式显示:

[
  {
    "Cid": 1284805663,
    "Name": "PARENT CATEGORY",
    "ParentCid": 0,
    "PicUrl": "",
    "SortOrder": 1,
    "Type": "manual_type"
  },
  {
    "Cid": 1284805664,
    "Name": "CHILD CATEGORY",
    "ParentCid": 1284805663,
    "PicUrl": "",
    "SortOrder": 1,
    "Type": "manual_type"
  }
]

在上面的例子中,我知道这两个连接的唯一方法是因为孩子ParentCid与父母Cid匹配。

我目前正在做的是绘制所有数据,但我想在子类别中添加一个类,我不确定如何区分这两个。

以下是我的代码,它映射了所有项目。

import React from 'react';
import {Link} from 'react-router';
import {animateScroll as scroll} from 'react-scroll';

class SellerStoreCategories extends React.Component {
  componentDidUpdate() {
    // scroll.scrollTo(document.documentElement.scrollTop, {
    scroll.scrollTo(400, {
      duration: 0,
      delay: 0,
      smooth: false
    })
 }

  render() {
    return (
      <div className="store__body__menu__accordian">
        <ul className="list-unstyled">
          {this.props.sellerCats.map((cat) => (
            <li>
              <Link
                to={`/seller/${this.props.storeName}/${cat.Cid}`} 
                className={`black-link ${this.props.activeCategory == cat.Cid ? 'active' : ''}`}
              >
                {cat.name_en}
              </Link>
          </li>)}
        </ul>
      </div>
    );
  }
}

export default SellerStoreCategories;

进一步澄清

我获得了数百个类别以及知道附加哪个类别的方式是ParentCid所以如果ParentCid与Cid匹配,那么Cid的ParentCid = 0那就是父类

所以基本上所有"ParentCid": 0,的类别都是父类别

1 个答案:

答案 0 :(得分:1)

您需要从数组中构建一个树。有几种方法可以在javascript中实现这一点。例如(代码未测试)

let childMap = { 0: [] }
let root = { Cid: 0, nodes: childMap[0] }
for (let i = 0; i < sellerCats.length; i++) {
    let category = sellerCats[i]
    childMap[category.Cid] = childMap[category.Cid] || []
    childMap[category.ParentCid] = childMap[category.ParentCid] || []
    category.nodes = childMap[category.Cid]
    childMap[category.ParentCid].push(category)
}

在此代码之后,'root'对象应包含数据的树表示,然后您可以使用类似的东西重新构建jsx:

buildCategory(cat) {
    return (
        <li>
            <Link
                to={`/seller/${this.props.storeName}/${cat.Cid}`} 
                className={`black-link ${this.props.activeCategory == cat.Cid ? 'active' : ''}`}
              >
              {cat.name_en}
            </Link>
            <ul>
                {cat.nodes && cat.nodes.length ?
                    cat.nodes.map(this.buildCategory)
                : '' }
            </ul>
        </li>
    )
}

render() {
    return (
        <div className="store__body__menu__accordian">
            <ul className="list-unstyled">
                {root.nodes.map(this.buildCategory)}
            </ul>
        </div>
    );
}