【问题标题】:Selecting values from an arry and storing in a variable从数组中选择值并存储在变量中
【发布时间】:2018-09-15 10:15:17
【问题描述】:

我正在尝试返回数组中的第二个和第三个值 - 但由于我有限的 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 

【问题讨论】:

  • 您能否分享您提供的示例输入数组的预期输出?
  • 嗨 - 我已经用上面的预期输出更新了帖子。干杯

标签: javascript arrays rhino


【解决方案1】:

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

这是您更新的 sn-p。您需要排序然后反转。并更改一些逻辑的顺序。

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

【讨论】:

  • @StevenSpungin - 解决方案有效 - 非常感谢您的帮助。
【解决方案2】:

如果我正确理解您的问题,您可以从以下输入开始:

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

【讨论】:

    【解决方案3】:
    // 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,然后根据分数对合并后的数组进行排序。

    【讨论】:

      【解决方案4】:

      这是您可以做的一件事: 考虑这是你的数组:

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

      您可以将数组的每个项目拆分为每个项目的两个单独的数组。 所以基本上:

      "0.003839795 - clothes" 变为 ["0.003839795","clothes"]

      这段代码 sn-p 会这样做:

      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 循环中编写这些并完成此任务^

      【讨论】:

      • 感谢这个 Sivan。我应该说该工具使用 Rhino JS,看起来您的代码不适用于该版本。有没有办法修改在我的原始帖子中有效的脚本,以查找第二、第三产品?我不介意我是否必须运行三个单独的脚本才能获得输出...谢谢
      猜你喜欢
      • 1970-01-01
      • 2014-11-25
      • 2022-12-11
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多