【问题标题】:Last boolean flag in JavaScriptJavaScript 中的最后一个布尔标志
【发布时间】:2017-04-08 09:28:49
【问题描述】:

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

    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

【问题讨论】:

    标签: javascript for-loop boolean flags


    【解决方案1】:

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

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

    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);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

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

    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);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

    • 谢谢。我接受了您的第一个建议,并首先对数据进行了排序。
    【解决方案2】:

    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/

    【讨论】:

    • 一个(最后一个)元素的数组?
    • 可能会有多个元素最后打印的情况
    【解决方案3】:

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

    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));

    【讨论】:

      猜你喜欢
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 2011-04-01
      相关资源
      最近更新 更多