Выбор значений из массива и сохранение в переменной - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь вернуть второе и третье значение в массиве - но изо всех сил пытаюсь сделать это из-за моего ограниченного знания JS.

У меня есть два массива, которые объединены в один и выглядит так:

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

Я хочу упорядочить массив по наибольшему количеству баллов, а затем разделить счет и категорию на отдельные переменные.

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

Сценарий, приведенный ниже, работает и может возвращать название продукта, но я не могу понять, как заставить его вернуть соответствующий счет или второй и третий продукт / результаты в массиве ...

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

Вывод для вышеуказанного массива будет выглядеть так:

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

Ответы [ 4 ]

0 голосов
/ 15 сентября 2018

Вот подход, который использует временную array of objects и сортирует по полю в объекте. Разбор обеспечивает некоторую гибкость для optional spaces. Он также преобразует счет в число с плавающей точкой, чтобы гарантировать, что начальные нули, отрицательные знаки и т. Д. Не приводят к неточному упорядочению.

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);
}

Вот ваш обновленный фрагмент. Вам нужно отсортировать и затем повернуть вспять И поменяйте порядок какой-нибудь своей логики.

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 голосов
/ 15 сентября 2018

Если я правильно понимаю ваш вопрос, вы начнете с этого ввода:

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

Оттуда вы хотите сначала отсортировать массив в порядке убывания (от наивысшего к низшему), а затем преобразовать (отобразить)вывод в следующем порядке вывода:

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

Вы можете отобразить => sort => reverse => значения формата, используя составные функции:

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 голосов
/ 15 сентября 2018
// 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];
});

Вот код для вас.Я использовал массивы, затем объединял их в один и затем сортировал объединенный массив на основе оценки.

0 голосов
/ 15 сентября 2018

Вот одна вещь, которую вы можете сделать: рассмотрим это ваш массив:

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

Вы можете разделить каждый элемент массива на два отдельных массива на элемент. Итак, в основном:

"0.003839795 - clothes" становится ["0.003839795","clothes"]

Этот фрагмент кода сделает это:

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

Теперь вы можете просто отсортировать их с помощью этой логики:

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

Теперь массив отсортирован в порядке возрастания и выглядит примерно так:

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

Теперь вы можете просто извлечь значения из этого отсортированного массива просто так:

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

Вы также можете написать их в простом цикле for и выполнить эту задачу ^

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...