有可能只映射数组的一部分吗?(Array.map())
Is it possible to map only a portion of an array? (Array.map())
我正在使用React.js作为前端框架构建一个项目。在一个特定的页面上,我向用户显示了完整的数据集。我有一个包含完整数据集的数组。它是一个JSON对象数组。在向用户显示数据方面,我目前让它通过使用Array.map()返回每个数据项来显示整个数据集。
这是朝着正确方向迈出的一步,但现在我只需要显示数据集的一部分,而不是整个数据集,我还需要一些控制,以了解已显示的总数据集的多少,以及尚未显示的数据集的多少。基本上,我正在构建一个类似于"查看更多"按钮的东西,它可以向用户加载更多的数据项。
这是我现在使用的'feed'代表我的JSON对象数组。(这将显示整个数据集。)
return (
<div className={feedClass}>
{
feed.map((item, index) => {
return <FeedItem key={index} data={item}/>
})
}
</div>
);
我想知道是否可以在数组的一部分上使用.map(),而不必事先分解数组?我知道一个可能的解决方案是保存完整的数据集,并将其分成几个部分,然后.map()这些部分,但是有没有一种方法可以在不分解数组的情况下。map()数组的一部分?
任何和所有的反馈是赞赏的。谢谢!
不要试图在映射步骤中通过hack来解决这个问题。
相反,slice()
在映射之前先将列表映射到正确的长度:
class Feed extends React.Component {
constructor(props) {
super(props)
this.handleShowMore = this.handleShowMore.bind(this)
this.state = {
items: ['Item A', 'Item B', 'Item C', 'Item D'],
showItems: 2
}
}
handleShowMore() {
this.setState({
showItems:
this.state.showItems >= this.state.items.length ?
this.state.showItems : this.state.showItems + 1
})
}
render() {
const items = this.state.items.slice(0, this.state.showItems).map(
(item) => <div>{item}</div>
)
return (
<div>
{items}
<button onClick={this.handleShowMore}>
Show more!
</button>
</div>
)
}
}
ReactDOM.render(
<Feed />,
document.getElementById('root')
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id='root'></div>
我认为最简单的方法就是使用滤镜和映射
const feed = [1,2,3,4,5,6,7,8,9,10,11]
feed.filter((item, index) => index < 5).map((filteredItem) => //do somthing with filtred item here//)
数组。Reduce应该照你说的做。只要根据你想要的范围改变if语句。
var excludeAfterIndex = 5;
feed.reduce((mappedArray, item, index) => {
if (index > excludeAfterIndex) { // Whatever range condition you want
mappedArray.push(<FeedItem key={index} data={item}/>);
}
return mappedArray;
}, []);
您可以使用之前的slice函数来映射数组,看起来您想在那里做一些分页。
var fruits = ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango'];
var citrus = fruits.slice(1, 3);
// fruits contains ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango']
// citrus contains ['Orange','Lemon']
如果您只想映射数组的一部分,您应该首先根据条件筛选()数组以获得期望的部分:
array.filter(item => <condition>).map();
可以,您可以根据索引映射数组的一部分。例如:
yourArray = yourArray.map(function (element, index, array) {
if (array.indexOf(element) < yourIndex) {
return {
//logic here
};
} else {
return {
//logic here
};
}
});
你可以使用slice来获取数组的一部分:
const data = [1,2,3,4,5,6,7,8,9,10,11]
var updatedData = data.slice(0, 3);
Array#map
遍历所有项。
map()
方法使用对数组中的每个元素调用提供的函数的结果创建一个新数组。
可以用Array#filter
filter()
方法创建一个包含所有通过所提供函数实现的测试的元素的新数组。
为所需的项目,然后应用map为所需的格式。
没有任何版本的map()函数只映射数组的一部分。
可以将。map()与。filter()结合使用。
你得到当前元素的索引作为map的第二个参数,如果你有一个当前页面和页面大小的变量,你可以很容易地从数组中过滤出正确的页面,而不必真的把它切片。
var currentPage = 1;
var pageSize = 25;
dataArray.filter(function(elt, index) {
var upperThreshold = currentPage * pageSize;
var lowerThreshold = currentPage * pageSize - pageSize;
return index < upperThreshold && index > lowerThreshold;
});
使用slice()
比在map或reduce函数中添加条件要好,但它仍然会创建一个额外的、未使用的数组段副本。根据你正在做的事情,这可能不是你想要的。相反,只需使用自定义map函数:
function sliceMap(fn, from, toExclusive, array) {
const len = toExclusive - from;
const mapped = Array(len);
for (let i = 0; i < len; i++) {
mapped[i] = fn(array[i + from], i);
}
return mapped;
};
注意,fn
接收数组值和(现在)从零开始的索引。您可能希望传递原始索引(i + from
)。您可能还希望将完整的array
作为第三个参数传递,Array.map
就是这样做的。
使用这个简单的方法
const [limit, setLimit] = useState(false);
const data = [{name: "john}, {name: 'Anna'}]
这里我们将有两种情况:
- 只显示第一个数据,即John
- 显示所有
data.slice(0, extended ? data.length : 1).map((item, index) => <Text>{item.name}</Text>)
…
- 为什么可以't我用Set对象调用Array.prototype.map
- 将Javascript响应转换为Array/Map
- Array.map() and D3 selection?
- 为什么 Array.prototype.reduce() 不接受 Map 对象作为初始值
- Array.from 在 Array#map 中不能用作直接回调函数
- 在 Array.map() 中调用类方法
- 如果 Array.prototype.map() 没有返回,它是否被正确使用
- ESLint prefer-arrow-callback on array.map
- Array.map没有'似乎无法处理未初始化的数组
- 为什么使用Array.prototype.map.call而不是Array.map.call
- Array.map 希望将值映射到无
- (new Array(10)).map(function() { return 1;}) 返回 [, , , , , .
- Array.map 和 Javascript 中的提升函数
- [].map.call() VS Array.prototype.map.call()?
- 正在使用 Array.map 作为 foreach 的良好做法
- 为什么 Array.map 似乎不适用于未定义值的数组
- 使用类似于 Array.prototype.map() 的方法将数组转换为键值对象
- 等待 array.map 等待中的异步进程
- JavaScript: parseInt's radix mystery with Array.map
- IE11 中的 Array.map() 出错