简化页面列表的生成以进行分页

时间:2016-05-22 13:55:35

标签: javascript pagination functional-programming lodash

我想显示一个paginator,这是我的函数,它产生我正在寻找的结果,但我认为它可以简化。

想法?

const WINDOW = 2;

const func = (item, items) => {
  const result = [];
  const itemIdx = _.indexOf(items, item);
  if (itemIdx - WINDOW > 0) {
    result.push('...');
  }
  result.push(
    _.map(itemIdx + WINDOW < items.length ?
      _.take(_.dropWhile(items, p => _.indexOf(items, p) < itemIdx - WINDOW), WINDOW * 2 + 1) :
      _.takeRight(_.dropRightWhile(items, p => _.indexOf(items, p) > itemIdx + WINDOW), WINDOW * 2 + 1)
    )
  );
  if (itemIdx + WINDOW < items.length - 1) {
    result.push('...');
  }
  return _.flatten(result);
};

const input = [1, 2, 3, 4, 5, 6, 7, 8, 9];
for (let i = 1; i < 10; i++) {
  console.log(i + ': ' + func(i, input));
}

输出:

"1: 1,2,3,4,5,..."
"2: 1,2,3,4,5,..."
"3: 1,2,3,4,5,..."
"4: ...,2,3,4,5,6,..."
"5: ...,3,4,5,6,7,..."
"6: ...,4,5,6,7,8,..."
"7: ...,5,6,7,8,9"
"8: ...,5,6,7,8,9"
"9: ...,5,6,7,8,9"

1 个答案:

答案 0 :(得分:2)

这个怎么样

function func(item, items){
    var window = 5, more = "...", //configs
        nothin = [], //util
        limit = items.length - window,
        i = Math.max(0, Math.min(limit, items.indexOf(item) - (window>>1)));

    return nothin.concat(
        i > 0? more: nothin, 
        items.slice(i, i + window),
        i < limit? more: nothin
    );
}