JS数组遍历得到连续相同值中的最后一个值

var arr = [
    { id: 1, selected: true },
    { id: 2, selected: true },
    { id: 3, selected: true },
    { id: 4, selected: false },
    { id: 5, selected: true },
    { id: 6, selected: false },
    { id: 7, selected: false },
    { id: 8, selected: false },
    { id: 9, selected: false },
    { id: 10, selected: true },
    { id: 11, selected: true },
    { id: 12, selected: false }
];

var arr2 = [
    { id: 1, selected: true, lastTrue: false },
    { id: 2, selected: true, lastTrue: false },
    { id: 3, selected: true, lastTrue: true },
    { id: 4, selected: false, lastTrue: false },
    { id: 5, selected: true, lastTrue: true },
    { id: 6, selected: false, lastTrue: false },
    { id: 7, selected: false, lastTrue: false },
    { id: 8, selected: false, lastTrue: false },
    { id: 9, selected: false, lastTrue: false },
    { id: 10, selected: true, lastTrue: false },
    { id: 11, selected: true, lastTrue: true },
    { id: 12, selected: false, lastTrue: false }
];

如何将arr1转化为arr2,即连续selected值为true的最后一个值,它的lastTrue为true

阅读 4.8k
6 个回答
// 只需要当前这个的selected为true  并且下一个(i+1)的为false即可,而最后一个的下一个为undefined同样为false,所以不用做特殊处理
arr.map((v, i) => ({...v, lastTrue: v.selected && !(arr[i + 1]||{}).selected}))

判断一下后个值即可,供参考

var newArr = arr.map(({id, selected}, i) => ({id, selected, lastTrue: selected && !arr[i+1].selected}))

你的 arr2的第二项 { id: 2, selected: true, lastTrue: true }是这样子的吧

在node环境下亲测成功,只需要将true改成其他值即可

var arr = [
    { id: 1, selected: true },
    { id: 2, selected: true },
    { id: 3, selected: true },
    { id: 4, selected: false },
    { id: 5, selected: true },
    { id: 6, selected: false },
    { id: 7, selected: false },
    { id: 8, selected: false },
    { id: 9, selected: false },
    { id: 10, selected: true },
    { id: 11, selected: true },
    { id: 12, selected: false }
]

var arr2 = [] 

arr.forEach(function(obj, index){
    
   

    if( (obj.selected === true) && (arr[index+1].selected !== true) ){
        obj.lastTrue = true
    } else {
        obj.lastTrue = false
    }
     arr2.push(obj)
})


console.log(arr2)

测试可以,可以看一下,写的比较麻烦

var newArr = [];
for (var i = 0; i < arr.length; i++) {
  var cur = arr[i];
  var next = arr[i + 1];
  
  var newItem = {
    id: cur.id,
    selected: cur.selected
  }
  
  newArr.push(newItem);
  
  if (!next) {
    newItem.lastTrue = newItem.selected;
    break;
  }
  
  if (!newItem.selected || next.selected) {
    newItem.lastTrue = false;
    continue;
  }
  
  newItem.lastTrue = true;
  
}
var arr2=arr.reduce(
        (x,y,z,m) => {
            x.push({
                id : y.id ,
                selected : y.selected,
                lastTrue : y.selected&&m[z+1]&&!m[z+1].selected
            })
            return x
        }
    ,[])
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题