javascript - 对象索引逐渐增长的数组数组

标签 javascript sorting dictionary filter reduce

简化版

对于...

ar = [
        {"element":"a","index":0},
        {"element":"b","index":1},
        {"element":"e","index":4},
        {"element":"d","index":3}
];

应该返回...

 ans = [[
        {"element":"a","index":0},
        {"element":"b","index":1},
        {"element":"e","index":4}],

       [{"element":"a","index":0},
        {"element":"b","index":1},
        {"element":"d","index":3}]
 ];

它可以返回仅包含 {"element":"e","index":4} 和 {"element":"d","index":3} 的数组,因为它后面没有任何内容,但它是没有必要。

原创 我有这个元素数组...

ar = [
        {"element":"c","index":2},
        {"element":"a","index":0},
        {"element":"b","index":1},
        {"element":"e","index":4},
        {"element":"d","index":3}
];

我想返回一个数组,其中包含每个对象的“索引”逐渐增长的序列,并且具有 obj1[index] < nextobj[index] 的最大对象数。 .

即它应该返回..

[
    [{"element":"c","index":2}, {"element":"e","index":4}], 
    [{"element":"c","index":2}, {"element":"d","index":3}],
    [{"element":"a","index":0}, {"element":"b","index":1}, {"element":"d","index":3}], 
    [{"element":"a","index":0}, {"element":"b","index":1}, {"element":"e","index":4}]
    [{"element":"d","index":3}],
    [{"element":"e","index":4}]
]

我尝试过使用 ar.reduce,但不太熟悉它,也不知道它是否适合这个实例。

最佳答案

不确定为什么这些没有在您的示例中列出

[{ element="a", index=0}, { element="e", index=4}]
[{ element="a", index=0}, { element="d", index=3}]
[{ element="b", index=1}, { element="e", index=4}]
[{ element="b", index=1}, { element="d", index=3}]

但是这可以产生接近的结果

var ar = [
        {"element":"c","index":2},
        {"element":"a","index":0},
        {"element":"b","index":1},
        {"element":"e","index":4},
        {"element":"d","index":3}
];

var results = [];

traverse([], 0);

function traverse(r, startIdx)
{
    if (startIdx >= ar.length){
        console.log(r);
        return;
    }

    for (var i = startIdx; i < ar.length ; i++){
        if ((startIdx == 0) || (r[r.length - 1].index) <= ar[i].index) {        
            rCopy = r.slice(0);
            rCopy.push(ar[i]);

            traverse(rCopy, i + 1);
        }
        else if (r.length > 0) {
            console.log(r);
        }
    }
}

JSFiddle1 , JSFiddle2

var ar = [
        {"element":"c","index":2},
        {"element":"a","index":0},
        {"element":"b","index":1},
        {"element":"e","index":4},
        {"element":"d","index":3}
];

var results = [];

traverse([], 0);
collapse(results);

//console.log(results);

for (var i = results.length - 1; i >= 0; i--) {
    console.log(results[i]);
}

function traverse(r, startIdx) {
    if (startIdx >= ar.length) {
        results.push(r);
        return;
    }

    for (var i = startIdx; i < ar.length ; i++) {
        if ((startIdx == 0) || (r[r.length - 1].index) <= ar[i].index) {
            rCopy = r.slice(0);
            rCopy.push(ar[i]);

            traverse(rCopy, i + 1);
        }
        else if (r.length > 0) {
            results.push(r);
        }
    }
}

function collapse() {
    for (var i = results.length - 1; i >= 0; i--) {
        for (var j = results.length - 1; j >= 0; j--) {
            if ((i !== j) && (contains(results[i], results[j]))) {
                results[i].remove = true;
            }
        }
    }

    for (var i = results.length - 1; i >= 0; i--) {
        if (results[i].remove) {
            results.splice(i, 1);
        }
    }
}

// Checks if set1 is contained within set2
function contains(set1, set2) {
    for (var i = 0; i < set1.length; i++) {
        var found = false;

        for (var j = 0; j < set2.length; j++) {
            if (set1[i].index === set2[j].index) {
                found = true;
                break;
            }
        }

        if (!found) {
            return false;
        }
    }

    return true;
}

JSFiddle3

关于javascript - 对象索引逐渐增长的数组数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22212315/

相关文章:

javascript - 按具有空值的多个条件对对象数组进行排序

python - 如何在python中将数字转换为字符串? 1 -> 'one'

javascript - 在文本框中键入时移动默认文本以及键入的文本

javascript - 在 Polymer 中获取文本字段的值

ruby - 当某些对象具有 nil 属性时,对哈希数组进行排序

c++11 结合 std::tuple 和 std::tie 以实现高效排序

excel - VBA-按属性筛选用户定义类的集合/词典的最有效方法

python - 在Python中的世界地图上覆盖数组

javascript - 如何在导航悬停时在单独的 div 更改中制作图像?

javascript - 了解插件代码中 $.each 内部传递的参数的用法