Usando Node.js 10. *

Me devuelven la siguiente estructura de datos:

const result = [
  {
    ID: 1,
    Reference: 'Id: 123, Name: "first'
  },
  {
    ID: 2,
    Reference: 'Name: "second'
  },
  {
    ID: 3,
    Reference: 'Id: 133, Name: "third'
  }
];

Quiero capturar el Id de cada referencia si existe, y empujar a una nueva matriz, lo que me daría lo siguiente:

// [123,133]

Puedo usar Filter and Map para filtrar lo que no contiene 'Id' en Referencia por lo siguiente:

let filter = result.filter(i => i.Reference.includes('Id:')).map(i => i.Reference)

Lo que me da:

// ['Id': 123, Name: 'first, 'Id': 133, Name: 'third'] 

Entonces, de la matriz anterior, tenía que quitar el Id para obtener:

// [123,133]

Usar subcadenas no parece funcionar para mí.

1
Jim Dover 28 oct. 2019 a las 18:55

3 respuestas

La mejor respuesta

Puede asignar la parte con una expresión regular para los dígitos y devolver un número.

const
    result = [{ ID: 1, Reference: 'Id: 123, Name: "first' }, { ID: 2, Reference: 'Name: "second' }, { ID: 3, Reference: 'Id: 133, Name: "third' }],
    filter = result
        .filter(i => i.Reference.includes('Id:'))
        .map(i => i.Reference)
        .map(s => +s.match(/Id:\s*(\d+)/)[1])

console.log(filter);
2
Nina Scholz 28 oct. 2019 a las 16:00

Puede usar la manipulación de matriz simple si solo extrae la porción de texto después de Id: (cuatro caracteres, hasta el índice 3 en la cadena) y la primera coma que aparecerá después del número:

const result = [ { ID: 1, Reference: 'Id: 123, Name: "first' }, { ID: 2, Reference: 'Name: "second' }, { ID: 3, Reference: 'Id: 133, Name: "third' } ]; 

function extractId(reference) {
  let from = 3;
  let to = reference.indexOf(",");
  
  return reference.slice(from, to);
}

let ids = result
  .filter(i => i.Reference.includes('Id:'))
  .map(i => i.Reference)
  .map(extractId)
  .map(Number);
  

console.log(ids);

Alternativamente, puede usar una expresión regular para capturar y extraer la ID

const result = [ { ID: 1, Reference: 'Id: 123, Name: "first' }, { ID: 2, Reference: 'Name: "second' }, { ID: 3, Reference: 'Id: 133, Name: "third' } ]; 

function extractId(reference) {
  let regex = /Id: (\d+)/;
  
  return reference.match(regex)[1];
}

let ids = result
  .filter(i => i.Reference.includes('Id:'))
  .map(i => i.Reference)
  .map(extractId)
  .map(Number);
  

console.log(ids);
1
VLAZ 28 oct. 2019 a las 16:07

Usando regex puedes quitar tu número de tu cadena

const Reference = 'Id: 133, Name: "third'

console.log(
  (/Id:\s(\d+),/g).exec(Reference)[1]
);

Solución final:

const result = [
  {
    ID: 1,
    Reference: 'Id: 123, Name: "first'
  },
  {
    ID: 2,
    Reference: 'Name: "second'
  },
  {
    ID: 3,
    Reference: 'Id: 133, Name: "third'
  }
];

const res = result
  .map(({Reference})=>+((/Id:\s(\d+),/g).exec(Reference)||[])[1])
  .filter(item=>!!item)

console.log(res);
2
kemicofa ghost 28 oct. 2019 a las 15:59