使用javascript和/或下划线基于类型以“棋盘”模式排列数组

时间:2014-02-17 20:45:18

标签: javascript jquery arrays sorting underscore.js

我有一系列由推文和Instagram照片组成的数据,这些数据将以下列方式显示在网站上:

TWEET | Instagram的

INSTAGRAM | TWEET

TWEET | Instagram的

INSTAGRAM | TWEET

数组中的推文数量远远大于Instagram照片的数量,但我想确保无论Feed中的项目数量如何,结果都会以这种方式交替显示。如何最有效地重新排列阵列,以便我保持这种模式?我只能使用javascript,jquery或下划线。

1 个答案:

答案 0 :(得分:0)

首先,您需要实现几个JS函数,如下所示:

function getElements() {
    // to be implemented by you, returns an array
}

function elementIsTweet(elem) {
    // to be implemented by you, returns a boolean
}

这里做了几个假设。一个重要的问题是,一旦推文或编纂已经用完,我们就会退出处理。还应注意,中间结果以阵列形式收集。对于大型集合,在构建结果数组时跟踪多个索引可能更有效。但是代码开始变得非常混乱:)

// this returns a single dimensional array,
// alternating between tweets and instragram
function getAlternatingArray() {
    var arr = getElements();

    // break array into separate parts
    var tweets = [], instagrams = [];
    for (var i = 0; i < arr.length; i++) {
        if (elementIsTweet(arr[i])) {
            tweets.push(arr[i]);
        } else {
            instagrams.push(arr[i]);
        }
    }

    // re-combine
    var newArr = [];
    var isTweet = (Math.randon() < .5);
    while (true) {
        var currArr = isTweet ? tweets : instagrams;
        if (currArr.length == 0) {
            break;
        }
        newArr.push(currArr.shift());
        isTweet = !isTweet;
    }
    return newArr;
}

最后,一旦你有一个具有交替项目类型的一维数组,创建一个“棋盘”多维数组是非常简单的。

function checkerBoardArray(columns) {
    // Error checking should be added to validate that columns is *even*
    var arr = getAlternatingArray();
    var newArr = [];
    for (var i = 0; i * columns < arr.length; i++) {
        var row = [];
        for (var j = 0; j < columns && i * j < arr.length; j++) {
            row.push(arr[i * j]);
        }
        newArr.push(row);
    }
    return newArr;
}