values recorrer objetos for array javascript arrays string

recorrer - for javascript



Unir una matriz por comas y "y" (6)

Quiero convertir la matriz [''one'', ''two'', ''three'', ''four''] en one, two, three and four

Tenga en cuenta que los primeros elementos tienen una coma y, sin embargo, está la palabra and entre el segundo y el último.

La mejor solución que he encontrado:

a.reduce( (res, v, i) => i === a.length - 2 ? res + v + '' and '' : res + v + ( i == a.length -1? '''' : '', ''), '''' )

Se basa en agregar las comas al final , con la excepción de la segunda y última ( a.length - 2 ) y con una forma de evitar la última coma ( a.length - 2 ).

Seguramente debe haber una forma mejor, más ordenada, más inteligente de hacer esto.

Es un tema difícil de buscar en los motores de búsqueda porque contiene la palabra "y" ...


A partir de V8 v7.2 y Chrome 72, puedes usar la dulce API Intl.ListFormat . También se encargará de localizar su lista cuando se solicite, lo que podría ser de gran ayuda si lo necesita.

const lf = new Intl.ListFormat(''en''); lf.format([''Frank'']); // → ''Frank'' lf.format([''Frank'', ''Christine'']); // → ''Frank and Christine'' lf.format([''Frank'', ''Christine'', ''Flora'']); // → ''Frank, Christine, and Flora'' lf.format([''Frank'', ''Christine'', ''Flora'', ''Harrison'']); // → ''Frank, Christine, Flora, and Harrison''

Incluso puede especificar opciones para que sea una interrupción y usar "o" en lugar de "y", o para formatear unidades como "3 pies, 7 pulgadas".

Referencias
La API Intl.ListFormat - Desarrolladores de Google
V8 release v7.2


Me gusta el enfoque de Mark Meyer (y votaría si tuviera el representante) ya que no altera la entrada. Aquí está mi giro:

function makeCommaSeparatedString(arr, useOxfordComma) { const listStart = arr.slice(0, -1).join('', ''); const listEnd = arr.slice(-1); const conjunction = arr.length <= 1 ? '''' : useOxfordComma && arr.length > 2 ? '', and '' : '' and ''; return [listStart, listEnd].join(conjunction); } console.log(makeCommaSeparatedString([''one'', ''two'', ''three'', ''four''])); // one, two, three and four console.log(makeCommaSeparatedString([''one'', ''two'', ''three'', ''four''], true)); // one, two, three, and four console.log(makeCommaSeparatedString([''one'', ''two''], true)); // one and two console.log(makeCommaSeparatedString([''one''])); // one console.log(makeCommaSeparatedString([])); //


Otro enfoque podría ser usar el método de splice para eliminar los dos últimos elementos de la matriz y unirlos usando el token and . Después de esto, podría empujar este resultado nuevamente en la matriz, y finalmente unir todos los elementos usando el separador,.

Actualizado a:

1) Muestre cómo funciona esto en varios casos (no se necesita control adicional sobre la longitud del arreglo).

2) Envuelve la lógica dentro de un método.

3) No mute la matriz original (si no es necesario).

let arrayToCustomStr = (arr, enableMutate) => { // Clone the received array (if required). let a = enableMutate ? arr : arr.slice(0); // Convert the array to custom string. let removed = a.splice(-2, 2); a.push(removed.join(" and ")); return a.join(", "); } // First example, mutate of original array is disabled. let input1 = [''one'', ''two'', ''three'', ''four'']; console.log("Result for input1:" , arrayToCustomStr(input1)); console.log("Original input1:", input1); // Second example, mutate of original array is enabled. let input2 = [''one'', ''two'']; console.log("Result for input2:", arrayToCustomStr(input2, true)); console.log("Original input2:", input2); // Third example, lenght of array is 1. let input3 = [''one'']; console.log("Result for input3:", arrayToCustomStr(input3)); // Fourth example, empty array. let input4 = []; console.log("Result for input4:", arrayToCustomStr(input4)); // Plus example. let bob = [ "Don''t worry about a thing", "Cause every little thing", "Gonna be all right", "Saying, don''t worry about a thing..." ]; console.log("Result for bob:", arrayToCustomStr(bob));

.as-console-wrapper { top: 0px; max-height: 100% !important; }


Puede usar Array.prototype.slice() cuando array.length es mayor que 1 y excluye el resto de los casos:

a.length > 1 ? `${a.slice(0, -1).join('', '')} and ${a.slice(-1)}` : {0: '''', 1: a[0]}[a.length]

Ejemplo de código:

const input1 = [''one'', ''two'', ''three'', ''four'']; const input2 = [''A Tale of Two Cities'', ''Harry Potter and the smth'', ''One Fish, Two Fish, Red Fish, Blue Fish'']; const input3 = [''one'', ''two'']; const input4 = [''one'']; const input5 = []; const result = a => a.length > 1 ? `${a.slice(0, -1).join('', '')} and ${a.slice(-1)}` : {0: '''', 1: a[0]}[a.length]; console.log(result(input1)); console.log(result(input2)); console.log(result(input3)); console.log(result(input4)); console.log(result(input5));


Una opción sería pop el último elemento, luego join todo el resto con comas y concatenar and además el último elemento:

const input = [''one'', ''two'', ''three'', ''four'']; const last = input.pop(); const result = input.join('', '') + '' and '' + last; console.log(result);

Si no puede mutar la matriz de entrada, use en su lugar la slice , y si solo puede haber un elemento en la matriz de entrada, primero verifique la longitud de la matriz:

function makeString(arr) { if (arr.length === 1) return arr[0]; const firsts = arr.slice(0, arr.length - 1); const last = arr[arr.length - 1]; return firsts.join('', '') + '' and '' + last; } console.log(makeString([''one'', ''two'', ''three'', ''four''])); console.log(makeString([''one'']));


Usando Array # reduce:

[''one'', ''two'', ''three'', ''four''].reduce( (a, b, i, array) => a + (i < array.length - 1 ? '', '' : '' and '') + b)