我有一个对象列表,我想合并连续的重复值.

在这个对象列表中,我们有三个值(B)和三个值(A).如果这些值是重复和连续的,我想在{list}处合并现有列表.

let array = [
    {list:[1,2,3], book:'A'},
    {list:[2,1,4], book:'B'},
    {list:[3,5,8], book:'A'},

    {list:[4,8,5], book:'B'},// *
    {list:[2,8,9], book:'B'},// *
    {list:[6,2,7], book:'B'},// *

    {list:[9,7,4], book:'A'},
    {list:[1,4,7], book:'B'},

    {list:[1,9,3], book:'A'},// *
    {list:[5,2,3], book:'A'},// *
    {list:[7,4,2], book:'A'},// *
]

结果将是这样的:

result = [
    {list:[1,2,3],             book:'A'},
    {list:[2,1,4],             book:'B'},
    {list:[3,5,8],             book:'A'},
    {list:[4,8,5,2,8,9,6,2,7], book:'B'},// *
    {list:[9,7,4],             book:'A'},
    {list:[1,4,7],             book:'B'},
    {list:[1,9,3,5,2,3,7,4,2], book:'A'},// *
]

提前谢谢你.

let array = [
    {list:[1,2,3], book:'A'},
    {list:[2,1,4], book:'B'},
    {list:[3,5,8], book:'A'},

    {list:[4,8,5], book:'B'},// *
    {list:[2,8,9], book:'B'},// *
    {list:[6,2,7], book:'B'},// *

    {list:[9,7,4], book:'A'},
    {list:[1,4,7], book:'B'},

    {list:[1,9,3], book:'A'},// *
    {list:[5,2,3], book:'A'},// *
    {list:[7,4,2], book:'A'},// *
]

    let A = []
    let B = []
    for (let x = 0; x < array.length; x++){
        if( array[x].book ==  'A' && array[x+1].book ==  'A'){
            A = A.concat(array[x].list, array[x+1].list)
        }
        else if( array[x].book ==  'B' && array[x+1].book ==  'B'){
            B = B.concat(array[x].list, array[x+1].list)
        }
    }
    let adds = []
    for (let x = 0; x < array.length; x++){
        if( array[x].book ==  'A' && array[x+1].book ==  'A' ){
            let A = d3.range( A[0], A[A.length-1]-1, -1)
            let obj = {list:A, book:'A'}
            adds.push(obj)
        }
        if( array[x].book ==  'B' && array[x+1].book ==  'B' ){
            let B = d3.range( B[0], B[B.length-1]+1, 1)
            let obj = {price:B, trend:'B'}
            adds.push(obj)

        }
            
        if ( array[x].book == 'A' && array[x+1].book == 'B' && array[x-1].book != 'A'){
            let obj = {list:array[x].list, book: 'A' }
            adds.push(obj)
        }

        if ( array[x].book == 'B' && array[x+1].book == 'A' && array[x-1].book != 'B' ){
            let obj = {list:array[x].list, book: 'B' }
            adds.push(obj)
        }
        
    }
    console.log( adds )

推荐答案

我认为你把事情变得更复杂了,以下是我的方法(我可能也这么做过):

let array = [
    {list:[1,2,3], book:'A'},
    {list:[2,1,4], book:'B'},
    {list:[3,5,8], book:'A'},

    {list:[4,8,5], book:'B'},// *
    {list:[2,8,9], book:'B'},// *
    {list:[6,2,7], book:'B'},// *

    {list:[9,7,4], book:'A'},
    {list:[1,4,7], book:'B'},

    {list:[1,9,3], book:'A'},// *
    {list:[5,2,3], book:'A'},// *
    {list:[7,4,2], book:'A'},// *
]

const result = [];

for (let i = 0; i < array.length; i++) {
  if (i === 0) {
    result.push(array[i]);
  } else if (array[i].book === result[result.length - 1].book) {
    result[result.length - 1].list.push(...array[i].list);
  } else {
    result.push(array[i]);
  }
}


console.log(result);

这种方法的主要部分是这个判断array[i].book === result[result.length - 1].book. 这样做是为了判断array中的元素在当前迭代中的book属性是否与result数组中的最后一个属性相同.

其余的只是将当前迭代的元素添加到result.当result为空时(第一次迭代)或当我前面提到的条件不满足时.

Javascript相关问答推荐

在React中获取数据后,如何避免不必要的组件闪现1秒?

useNavigation更改URL,但不呈现或显示组件

类型自定义lazy Promise. all

我可以从React中的出口从主布局调用一个处理程序函数吗?

为什么ngModel不能在最后一个版本的Angular 17上工作?'

TypeScript索引签名模板限制

在react JS中映射数组对象的嵌套数据

如何在JavaScript文件中使用Json文件

如何从HTML对话框中检索单选项组的值?

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

在数组中查找重叠对象并仅返回那些重叠对象

未加载css colored颜色 ,无法将div设置为可见和不可见

如何使用JS创建一个明暗功能按钮?

Rxjs流中生成IMMER不能在对象上操作

自定义确认组件未在vue.js的v菜单内打开

如何在Press上重新启动EXPO-AV视频?

未捕获的运行时错误:调度程序为空

如何缩小函数中联合返回类型的范围

单击子按钮时将活动切换类添加到父分区

带有JS模块模式的Rails的Importmap错误:";Net::ERR_ABORTED 404(未找到)&Quot;