如何合并对象列表中连续的重复值?

问题描述 投票:0回答:1

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

在此对象列表中,我们有 3 个

(B)
值和 3 个
(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 )

javascript list object d3.js
1个回答
0
投票

我认为你已经让事情变得更加复杂了,这是我的方法(我可能也这样做了):

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
。 其作用是检查当前迭代中
book
中元素的
array
属性是否与
result
数组中的最后一个相同。

剩下的就是将当前迭代的元素添加到

result
。当
result
为空时(第一次迭代)或者当我之前提到的条件不满足时。

© www.soinside.com 2019 - 2024. All rights reserved.