JavaScript中的最后一个布尔标志

时间:2017-04-08 09:28:49

标签: javascript for-loop boolean flags

我有以下数据结构,它使用标志动态设置最后一项:

    var data = [
        {
            "id":"One",
            "last":false,    
        },
        {
            "id":"Two",
            "last":true,    
        },
        {
            "id":"Three",
            "last":false,    
        },
        {
            "id":"Four",
            "last":false,    
        },
        {
            "id":"Five",
            "last":false,    
        }
    ];

    for (var i = 0; i < data.length; i++) {
        console.log(data[i].id);
    }

如何利用布尔值,以便按此顺序将代码输出到日志中?

One
Three
Four
Five
Two

3 个答案:

答案 0 :(得分:3)

您可以按last属性对数据进行排序。

Array#sort不是必需的stable。在这种情况下见下文。

&#13;
&#13;
var data = [{ id: "One", last: false }, { id: "Two", last: true }, { id: "Three", last: false }, { id: "Four", last: false }, { id: "Five", last: false }];

data.sort(function (a, b) {
    return a.last - b.last;
});

console.log(data);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

或者您可以过滤数组并连接falsetrue子数组的两个部分。

&#13;
&#13;
function last(flag) {
    return function (a) {
        return a.last === flag;
    };
}

var data = [{ id: "One", last: false }, { id: "Two", last: true }, { id: "Three", last: false }, { id: "Four", last: false }, { id: "Five", last: false }],
    temp = data.filter(last(false)).concat(data.filter(last(true)));

console.log(temp);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 1 :(得分:0)

Delare一个新数组

var newArr = [];
for (var i = 0; i < data.length; i++) {
    if (data[i].last) {
         newArr.push(data[i]);
    } else {
      console.log(data[i].id);
    }
}

for (var i = 0; i < newArr.length; i++) {
   console.log(newArr[i].id);
}

JS FIDDLE:https://jsfiddle.net/doptjgs2/

答案 2 :(得分:0)

实际上,这只是通过至少两种方法在O(n)中完成的。一个是递归的(falsesFirst函数如下),另一个是.reduceRight()truesLast函数下面);

&#13;
&#13;
var data    = [{"id":"One","last":false},{"id":"Two","last":true},{"id":"Three","last":false},{"id":"Four","last":false},{"id":"Five","last":false}],
falsesFirst = d => d.length ? d[0].last ? falsesFirst(d.slice(1)).concat(d[0])
                                        : [d[0]].concat(falsesFirst(d.slice(1)))
                            : [],
  truesLast = d => d.reduceRight((r,o) => o.last ? r.concat(o) : [o].concat(r),[]);

console.log(falsesFirst(data));
console.log(truesLast(data));
&#13;
&#13;
&#13;