Estoy tratando de devolver el segundo y tercer valor en una matriz, pero estoy luchando por hacerlo con mi limitado conocimiento de JS.

Tengo dos matrices que se combinan en una y se ve así:

"0.003839795 - clothes ,0.171756425 - food",0.00741361072561247 - electronics"

Quiero ordenar la matriz por la puntuación más alta y luego retirar la puntuación y la categoría en variables separadas.

category1 = value
category1score = value
cat2 score = value
cat2 score = value

El siguiente script funciona y puede devolver el nombre del producto superior, pero no puedo encontrar la manera de hacer que devuelva el puntaje asociado o el segundo y tercer producto / puntajes en la matriz ...

var product;
var finalString=","+user.get('array1')+user.get('array2');
var finalArray = finalString.split(',');
product = finalArray.sort()[finalArray.length - 1] +' - ';
return product.split(' - ')[1];

La salida para la matriz anterior se vería así:

cat1 = food 
cat1score = 0.171756425 
cat2 = electronics 
cat2score = 0.00741361072561247 
cat3= clothes 
cat3score = 0.003839795 
0
Nicholas 15 sep. 2018 a las 13:15

4 respuestas

La mejor respuesta

Aquí hay un enfoque que utiliza un array of objects temporal, y se ordena por un campo en el objeto. El análisis proporciona cierta flexibilidad para optional spaces. También convierte la puntuación en un flotante para garantizar que los ceros a la izquierda, los signos negativos, etc., no provoquen un pedido incorrecto.

const data = `0.003839795 - clothes ,0.171756425 - food ,0.00741361072561247 - electronics`

let items = [];

const parts = data.split(/\s*,\s*/)
parts.forEach(function (part) {
  const pair = part.split(/\s*-\s*/);
  items.push({
    score: parseFloat(pair[0]),
    name: pair[1]
  });
})

// sort by score, descending
items.sort(function (a, b) { return b.score - a.score });

for (let i = 0; i < items.length; i++) {
  console.log('cat' + (i+1) + '= ' + items[i].name);
  console.log('cat' + (i+1) + 'score= '+ items[i].score);
}

Aquí está su fragmento actualizado. Necesita ordenar y luego revertir. Y cambie el orden de algunas de sus lógicas.

var product;
var finalString = `,,,0.003839795 - clothes ,0.171756425 - food ,0.00741361072561247 - electronics`

var finalArray = finalString.split(',');
finalArray.sort().reverse()
finalArray = finalArray.filter(function(it) {
  return it.trim().length > 0
})

var rets=[];
for (var i = 0; i < finalArray.length; i++) {
  var product = finalArray[i]
  var pair = product.split(' - ');

  var ret = {
    product: pair[1],
    score: pair[0]
  }
  rets.push(ret)
  console.log(ret)
}
0
Steven Spungin 15 sep. 2018 a las 14:17

Aquí hay una cosa que puede hacer: considere esta es su matriz:

let arr = ["0.003839795 - clothes" ,"0.171756425 - food","0.00741361072561247 - electronics"];

Puede dividir cada elemento de la matriz en dos matrices individuales por elemento. Así que básicamente:

"0.003839795 - clothes" se convierte en ["0.003839795","clothes"]

Este fragmento de código hará eso:

let splittedArray = arr.map((value) => {
    return value.split('-').map((v) => v.trim());
});

Ahora solo puede ordenarlas con esta lógica:

splittedArray.sort((x, y) => y[0] - x[0]);

Ahora, la matriz está ordenada en orden ascendente y se ve más o menos así:

[
  [
    "0.171756425",
    "food"
  ],
  [
    "0.00741361072561247",
    "electronics"
  ],
  [
    "0.003839795",
    "clothes"
  ]
]

Ahora, puede sacar valores de esta matriz ordenada simplemente de esta manera:

cat1 = splittedArray[0][1]; 
cat1score = splittedArray[0][0];
cat2 = splittedArray[1][1]; 
cat2score = splittedArray[1][0];
cat3= splittedArray[2][1];
cat3score = splittedArray[0][0];

También puede escribirlos en un bucle for simple y realizar esta tarea ^

0
Sivcan Singh 15 sep. 2018 a las 10:51

Si entiendo su pregunta correctamente, comienza con esta entrada:

const arr = [
  '0.003839795 - clothes',
  '0.171756425 - food',
  '0.00741361072561247 - electronics'
  // ...
];

A partir de ahí, primero debe ordenar la matriz en orden descendente (de mayor a menor), luego transformar (asignar) la salida en el siguiente orden de salida:

cat1 = food 
cat1score = 0.171756425 
cat2 = electronics 
cat2score = 0.00741361072561247 
cat3 = clothes 
cat3score = 0.003839795 

Puede asignar => ordenar => invertir => formatear valores utilizando funciones componibles:

const arr = [
  '0.003839795 - clothes',
  '0.171756425 - food',
  '0.00741361072561247 - electronics'
  // ...
];

const toTuples = val => val.split(' - ');
const floatSort = (a, b) => parseFloat(a[0]) - parseFloat(b[0]);

const toOutputFormat = (tuple, index) => `
cat${index + 1} = ${tuple[1]}
cat${index + 1}score = ${tuple[0]}
`

arr.map(toTuples).sort(floatSort).reverse().map(toOutputFormat);
0
Mark 15 sep. 2018 a las 10:39
// initializing categories
categories = ["Food", "Electronics", "Cloths"];
// initializing scores
scores = [0.171, 0.0074, 0.0038];
// constructing array or array with categories and scores
out = [];
categories.forEach(function(d, i){
 out.push([d, scores[i]]); 
});
// sorting out array based on the score
out.sort(function(x, y) {
 return y[1]-x[1];
});

Aquí está el código para ti.
He utilizado matrices, luego las fusioné en uno y luego las clasifiqué en función de la puntuación.

0
Aagam Jain 15 sep. 2018 a las 10:41