关于数组遍历的问题

有这样一个数组
[
{key:59,value:ture},
{key:59,value:flase},
{key:58,value:true},
{key:57,value:true},
{key:56,value:true},
{key:58,value:false}
]

我想得到的效果是,key值如果有重复:
则把重复的key后面的value值进行比较,true的数量比false多一,则把该key的值提出来,生成一个以下划线相连接的字符串,类似这种格式 59_58_57
若key值没有重复,则直接提出来生成 57_56 这种格式
若value值true和false一样多,则生成的字符串中不含有该key
如,上面的数组输出的结果是57_56,
跪求大神解答!

阅读 1.7k
2 个回答
var a = [
            {key:59,value:true},
            {key:59,value:false},
            {key:58,value:true},
            {key:57,value:true},
            {key:56,value:true},
            {key:58,value:false}
        ];
//将条件合适的放入数组,最后join('_')
a.reduce((pre, cur, index, arr) => {
    var keyIndex = pre.indexOf(cur.key);
    if (keyIndex < 0) {
        pre.push(cur.key);
    } else { 
        (arr.filter(item => item.key === cur.key && item.value).length - 
        arr.filter(item => item.key === cur.key && !item.value).length) <= 0 
        && pre.splice(keyIndex, 1); //如果true的数量多于false的数量则留,少则去除
    }
    return pre;
},[]).join('_')
新手上路,请多包涵
var a = [
            {key:59,value:true},
            {key:59,value:false},
            {key:58,value:true},
            {key:57,value:true},
            {key:56,value:true},
            {key:58,value:false}
        ];
var obj = {};
a.forEach((temp,index)=>{
    if(obj[temp.key]){
        obj[temp.key] +='_'+index;
    }else{
        obj[temp.key] = ''+index;
    }
});
for(var key in obj){
    if(obj[key].indexOf('_')>-1){
        var b = obj[key].split('_');
        var count = 0;
        b.forEach(temp=>{
            if(a[temp].value) count++;
            else count--;
        });
        if(count>0) obj[key] = true;
        else obj[key] = false;
    }else{
        obj[key] = true;
    }
}
var s = a.filter(temp=>obj[temp.key]).map(temp=>temp.key).join('_');
document.write(s);

你试试看

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题