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í.
3 respuestas
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);
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);
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);
Preguntas relacionadas
Nuevas preguntas
javascript
Para preguntas sobre la programación en ECMAScript (JavaScript / JS) y sus diversos dialectos / implementaciones (excepto ActionScript). Incluya todas las etiquetas relevantes en su pregunta; por ejemplo, [node.js], [jquery], [json], etc.