这个数组逻辑该怎么实现?根据字段名求值

图片描述

  1. 2个数组,第一个划线是字段名数组 要关联到下面的数组,对应字段名取时间;
  2. 大数组第一个字段名对应的有时间,第二个没时间的话,譬如第二个index是4,就判断它后面所有的(红圈里的)如果有时间的话就操作仪表盘隐藏,没有时间都是null的话就本地时间减第一个时间;

这是我目前实现逻辑代码,我该怎么写?_valueStatu字段名数组,fieldsDatas二维数组;

      var _fieldsTime = [];
        for(var i = 0; i < _valueStatu.length; i++){

            for(var j = 0; j < fieldsDatas.length; j++){
                if(_valueStatu[i] == fieldsDatas[j]._state){
                    _fieldsTime.push(fieldsDatas[j]._column)
                }
            }
        }

阅读 2.5k
3 个回答

解决了,这是答案:

        var _fieldsTime_Value = "";
        var _fieldsTimeTdoOne = [];
        //第一个为0
        if (_fieldsTime[0] === null) {
            _fieldsTime_Value = 'none';
        }
        //两个都有值
        if (!!_fieldsTime[0] && !!_fieldsTime[1]) {
            _fieldsTimeTdoOne = Math.round(parseInt(_fieldsTime[1] - _fieldsTime[0]) / 
            1000 / 60);              
        }
        //第一个有值,第二个没值
        if (!!_fieldsTime[0] && !_fieldsTime[1]) {
            var start = fieldsDatas.length;
            var none = false
            for (let i = 0; i < fieldsDatas.length; i++) {
                if (fieldsDatas[i]._state == _valueStatu[1]) {
                    start = i
                    break;
                }
            }
            for (let j = start; j < fieldsDatas.length; j++) {
                if (fieldsDatas[j]._column) {
                    none = true
                }
            }
            if (none) {
                _fieldsTime_Value = 'none'
            } else {
                _fieldsTimeTdoOne = Math.round(parseInt(new Date().getTime() - new 
                Date(_fieldsTime[0]).getTime()) / 1000 / 60);
                console.log(_fieldsTimeTdoOne)
            }
        }

原答案里也没什么 es5 写不出来的东西吧...

var times = fieldsDatas.map(function (field) {
    var data = {};
    data[field['_state']] = field['_column'];
    return data;
})

if (times[_valueStatu[1]]) {
    // 存在第二个时间
} else {
    var offset = Object.keys(times).indexOf(_valueStatu[1]));
    var noneNull = Object.keys(times)
                        .map(function (key, index) { 
                            // 检查是否已经到了第二个查询字段之后,因为你题目中说是红框中
                            return index <= offset ? null
                                            : times[key] === null})
                        .indexOf(true) === -1;
     if (noneNull) {
         // 都有时间值
     } else {
         // 存在 null 值
     }
}

先把第二个数组转换一下:

let times = fieldsDatas.map(field => {
    let data = {};
    data[field['_state']] = field['_column'];
    return data;
})

然后就可以直接读取了

if (times[_valueStatu[1]]) {
    // 存在第二个时间
} else {
    let offset = Object.keys(times).indexOf(_valueStatu[1]));
    let noneNull = Object.keys(times)
                        .map((key, index) => 
                            // 检查是否已经到了第二个查询字段之后,因为你题目中说是红框中
                            index <= offset ? null
                                            : times[key] === null)
                        .indexOf(true) === -1;
    /**
     * 对 times 数组进行一次映射
     * 比如按照此题会得到
     * [null, null, null, null, null,
     *  true, false, false, false, true]
     * 那么这个数组中只要存在 true 
     * 即意味着原来的 times 数组里 InlabbingTime 之后的时间里有 null 值, 
     * 换句话说,如果找不到 true 那么原来的 times 数组里 InlabbingTime 之后的时间里全都不为空。
     **/
     if (noneNull) {
         // 都有时间值
     } else {
         // 存在 null 值
     }
}
var _fieldsTime = [];
var time = null;
for(var i = 0; i < _valueStatu.length; i++){
    for(var j = 0; j < fieldsDatas.length; j++) {
        if (_valueStatu[i] == fieldsDatas[j]._state) {
            time = fieldsDatas[j]._column;
            if (equalToNull(time)) {
                return handler(j + 1, ,);
            }
            _fieldsTime.push(time);
            break;
        }
    }
}

// 
function handler (index, allnull, notallnull) {
    var length = fieldsDatas.length;
    for(var i = index; i < length; i++) {
        if (!equalToNull(fieldsDatas[i])) {
            notallnull();
            return;
        }
    }
    allnull();
}

function equalToNull (value) {
    return value == null;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏