如何使用地图渲染项目列表,但每3个项目分组一次?

时间:2019-02-26 23:13:37

标签: javascript arrays reactjs

我在数组中有很长的项目列表。这些都需要在一个组件中呈现,并且应该很好。但是,我需要每3个项目将它们包裹在另一个组件中。

所以,如果我只是渲染项目,它将看起来像这样:

return (
  <div>
    items.map((x, index) => {
      <span key={index}>{x}</span>
    })
  </div>
)

但基本上,我希望每三个项目都被包装在具有特殊类的div中,所以是这样的:

return (
  <div>
    <div className='group-of-3'>
      <span>Item 1</span>
      <span>Item 2</span>
      <span>Item 3</span>
    </div>
    <div className='group-of-3'>
      <span>Item 4</span>
      <span>Item 5</span>
      <span>Item 6</span>
    </div>
    .
    .
    .
  </div>
)

执行此操作的理想方法是什么?请记住,商品的数量确实会发生变化,因此手动进行是不可能的。

4 个答案:

答案 0 :(得分:3)

您可以使用Lodash chunk将数组拆分为长度为3的数组,然后分别进行渲染。

示例

function App(props) {
  const chunkedItems = _.chunk(props.items, 3);

  return (
    <div>
      {chunkedItems.map((arr, index) => (
        <div key={index}>
          {arr.map((item, index) => (
            <span key={index}>{item}</span>
          ))}
        </div>
      ))}
    </div>
  );
}

ReactDOM.render(
  <App items={[1, 2, 3, 4, 5, 6, 7]} />,
  document.getElementById("root")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

<div id="root"></div>

答案 1 :(得分:3)

使用纯JavaScript,您可以使用Array.reduce()从您的商品创建子数组。然后两次映射您的物品:

border: 1px solid #34c1e5;
const group = (items, n) => items.reduce((acc, x, i) => {
  const idx = Math.floor(i / n);
  acc[idx] = [...(acc[idx] || []), x];
  return acc;
}, []);

function Example({ items }) {
  return (
    <div>{group(items, 3).map(children =>
        <div className='group-of-3'>
          {children.map((x, i) => <span key={i}>{x}</span>)}
        </div>
    )}</div>
  );
}

ReactDOM.render(
  <Example items={[1, 2, 3, 4, 5, 6, 7, 8]} />,
  document.getElementById('root')
);
.group-of-3 {
  border: 1px solid black;
  padding: 5px;
  margin: 5px;
  width: 50px;
  text-align: center;
}

答案 2 :(得分:1)

您可以使用Array.from()将列表划分为类别,并使用内部Array.map()来呈现项目:

const items = ['item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7', 'item8', 'item9', 'item10', 'item11'];

const Demo = ({ items, size = 3 }) => (
  <div>
    {Array.from(
      { length: Math.ceil(items.length / size) },
      (_, i) => (
        <div key={i} className='group-of-3'>
        {items.slice(i * size, (i + 1) * size)
          .map((item) => <span key={item}>{item}</span>)
        }
        </div>
      )
    )}
  </div>
);


ReactDOM.render(
  <Demo items={items} />,
  demo
);
.group-of-3 {
  margin: 1em 0;
  border: 1px solid black;
}

span {
  display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

<div id="demo"></div>

答案 3 :(得分:1)

您可以先将数组的元素分为多个较小的数组,每个数组包含3个元素。

const arr = [1,2,3,4,5,6,7,8,9];

const grouped = arr.reduce((res, el, i) => {
  if (i % 3 === 0) {
    res[res.length] = [el];
  } else {
    res[res.length-1] = [...res[res.length-1], el];
  }
  return res;
}, []);

console.log(grouped);