Tengo el json a continuación:

 [ { status: 'complete',
    type: 'bid',
    amount: 0,
    units: 0,
    activeId: 146,
    id: 3 },
  { status: 'complete',
    type: 'ask',
    amount: 0,
    units: 0,
    activeId: 146,
    id: 1 },
  { status: 'pending',
    type: 'ask',
    amount: '1009',
    units: 0.996,
    activeId: 146,
    id: 2,
    env: 'newInsert' },
  { status: 'complete',
    type: 'ask',
    amount: 0,
    units: 0,
    id: 2,
    activeId: 146 },
  { status: 'complete',
    type: 'bid',
    amount: 0,
    units: 0,
    activeId: 146,
    id: 4 },
  { status: 'pending',
    type: 'bid',
    amount: 1012,
    units: 3.004,
    id: 11,
    activeId: 146,
    env: 'newInsert' } ]

En esta matriz, necesito eliminar el objeto donde la identificación es la misma y cambia de estado "pendiente" a "completo" por ejemplo:

{ status: 'pending',
    type: 'ask',
    amount: '1009',
    units: 0.996,
    activeId: 146,
    id: 2,
    env: 'newInsert' },
  { status: 'complete',
    type: 'ask',
    amount: 0,
    units: 0,
    id: 2,
    activeId: 146 } 
here same id of type ask and status changed pending to complete.

Intenté en general hacer un bucle con foreach y hacer coincidir y extraer el resultado, pero ¿hay alguna forma específica o algún filtro que agrupe las cosas y extraiga?

-1
Sikander 18 feb. 2018 a las 13:58

2 respuestas

La mejor respuesta

Usando funciones filter y some

var array = [{    status: 'complete',    type: 'bid',    amount: 0,    units: 0,    activeId: 146,    id: 3  },  {    status: 'complete',    type: 'ask',    amount: 0,    units: 0,    activeId: 146,    id: 1  },  {    status: 'pending',    type: 'ask',    amount: '1009',    units: 0.996,    activeId: 146,    id: 2,    env: 'newInsert'  },  {    status: 'complete',    type: 'ask',    amount: 0,    units: 0,    id: 2,    activeId: 146  },  {    status: 'complete',    type: 'bid',    amount: 0,    units: 0,    activeId: 146,    id: 4  },  {    status: 'pending',    type: 'bid',    amount: 1012,    units: 3.004,    id: 11,    activeId: 146,    env: 'newInsert'  }];

var result = array.filter(o => {
  var transition = o.status === 'pending' ? 'complete' : 'pending';  
  return !(array.some((io) => io.id == o.id && io.status === transition));
});

console.log(result);
.as-console-wrapper {
  max-height: 100% !important
}
0
Ele 18 feb. 2018 a las 11:38

Para eliminar los elementos que tienen la misma identificación, puede crear un objeto por identificación y luego verificar las longitudes (usando reducir):

var arr = [{    status: 'complete',    type: 'bid',    amount: 0,    units: 0,    activeId: 146,    id: 3  },  {    status: 'complete',    type: 'ask',    amount: 0,    units: 0,    activeId: 146,    id: 1  },  {    status: 'pending',    type: 'ask',    amount: '1009',    units: 0.996,    activeId: 146,    id: 2,    env: 'newInsert'  },  {    status: 'complete',    type: 'ask',    amount: 0,    units: 0,    id: 2,    activeId: 146  },  {    status: 'complete',    type: 'bid',    amount: 0,    units: 0,    activeId: 146,    id: 4  },  {    status: 'pending',    type: 'bid',    amount: 1012,    units: 3.004,    id: 11,    activeId: 146,    env: 'newInsert'  }];


var map = arr.reduce((ac, x) => ({
  ...ac,
  [x.id]: [...(ac[x.id] || []), x]
}), {})


var res = Object.keys(map).reduce((ac, x) =>
  map[x].length > 1 &&
  map[x].some(z => z.status == 'pending') &&
  map[x].some(z => z.status == 'complete') ?
  ac : [...ac, ...map[x]], [])

console.log(res)
0
maioman 18 feb. 2018 a las 11:21