【问题标题】:Sort Related Arrays In Corresponding Fashion Javascript以相应的方式对相关数组进行排序 Javascript
【发布时间】:2014-01-12 23:23:28
【问题描述】:

我正在尝试处理 JSON 对象并进行数学计算以计算重量。订单在我的算法中很重要,但 JSON 对象中的产品顺序会按照客户将它们添加到购物车的顺序传递给我。我需要以相同的方式对多个属性进行排序。

在以下示例中,客户在“错误”(1.5,1,1.25) 订单中添加了产品,因此 object.products 如下所示:

"products":[
{
  "quantity": 3,
  "weight_each": 1.5
},
{
  "quantity": 4,
  "weight_each": 1
},
{
  "quantity": 2,
  "weight_each": 1.25
}

我的第一步是将这些对象添加到对键盘更友好的数组中:

for (var i = 0; i < object.products.length; i++)
{
  quantity[i] = object.products[i].quantity;
  weight[i] = object.products[i].weight_each;
}

如前所述,我的算法要求产品按重量(升序)排序。我知道如何对每个数组进行独立排序 [weight.sort()],但我不知道如何对每个数组进行排序,以便在排序后,权重 [0] 和数量 [0] 引用相同的产品。

我的最终结果应该是这样的:

console.log(weight)   // [1,1.25,1.5]
console.log(quantity) // [4,2,3]

我用谷歌搜索了许多不同的短语并尝试了几种不同的方法。如果这已经得到回答,或者这是一个基本问题,我深表歉意。我似乎无法独自克服这个障碍,非常感谢所有答案! :)

【问题讨论】:

标签: javascript arrays json sorting


【解决方案1】:

在将quantityweight_each 分成两个未连接的数组之前,对weight_each 上的产品数组进行排序:

input = '{"products":[{"quantity":3,"weight_each":1.5},{"quantity":4,"weight_each":1},{"quantity":2,"weight_each":1.25}]}';

data = JSON.parse( input );

data.products.sort( function(a,b){return a.weight_each - b.weight_each; } );

for ( var i = 0; i < data.products.length; i++)
{
  quantity[i] = data.products[i].quantity;
  weight[i]   = data.products[i].weight_each;
}

【讨论】:

  • 我要试一试,感谢您的快速回复!我会在完成我的刺后发表评论!
  • 我仍然不完全理解您提供给我的排序功能是如何工作的,但我知道它确实有效。如果您愿意用外行的术语进行解释,则可以加分。无论如何,非常感谢您的帮助!
  • Array.sort() 可以采用比较器函数,当它尝试查找数组的一个元素是在另一个之前、等于还是在另一个之后,它将两个对象都传递给比较器函数,返回值将是-ve、0 或 +ve。数值的默认比较器可以简化为function(a,b){return a-b;},会直接比较对象的值;但是,提供自定义比较器 function(a,b){return a.x-b.x;} 会将其更改为比较两个元素的属性 x 的值。
  • 它更冗长,但您也可以将比较器函数重写为:data.product.sort( function(a,b){ if(a.weight_each&lt;b.weight_each)return -1;if(a.weight_each&gt;b.weight_each)return +1; return 0;} )
【解决方案2】:

你的第一步错了! 首先对输入数组进行排序,使每个产品按重量排序。然后,当您将其拆分为两个单独的数组时,它们将按正确的顺序排列。

当然,您可以这样保留它,但是您需要编写手动排序,在其中对两个数组执行相同的操作。例如,如果一个排序步骤切换索引 0 和 1 的位置,那么您在两个数组上都执行此操作(对于所有排序步骤,依此类推)。

【讨论】:

    【解决方案3】:

    将商品添加到购物车后,添加一个名为 total weight 的变量,即数量 * 重量。然后按total weight 排序。现在不管你怎么洒,它总是按重量排序的。

    【讨论】:

    • 在上面的示例中,这将给出排序数组为total_weight=[2.5,4,4.5]weight=[1.25,1,1.5]quantity=[2,4,3],它们不会按weightquantity 的升序排序。这如何回答这个问题?
    猜你喜欢
    • 2016-07-12
    • 2019-06-24
    • 2012-04-12
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多