从数组中选择值并存储在变量中

Selecting values from an arry and storing in a variable

我正在尝试 return 数组中的第二个和第三个值 - 但以我有限的 JS 知识很难做到这一点。

我有两个数组合二为一,如下所示:

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

我想按最高分数对数组进行排序,然后将分数和类别拉回到单独的变量中。

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

下面的脚本可以 return 顶级产品名称,但我不知道如何使它 return 相关分数或第二和第三 prod/scores在数组中...

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 

您可以执行以下操作: 考虑这是你的数组:

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循环来完成这个任务^

如果我正确理解你的问题,你从这个输入开始:

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 

您可以映射 => 排序 => 反向 => 使用可组合函数格式化值:

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

这是给你的代码。
我已经习惯了数组,然后将其合并为一个 ans,然后根据分数对合并后的数组进行排序。

这是一种使用临时 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)
}