【问题标题】:Sorting javascript array of nested objects对嵌套对象的javascript数组进行排序
【发布时间】:2016-07-01 11:09:51
【问题描述】:

我是 JavaScript 新手,我正在尝试尽可能多地学习,但我觉得我正在尝试做的事情已经碰壁了。

我的问题,我有一个对象数组,其中每个对象是一个 shop 对象,这是一个具有维修成本属性的“类型”维修对象。

如何按价格排序?到目前为止,请查看我的代码。我需要按价格顺序返回商店对象,因为我仍然需要商店的所有信息,但是根据所做的选择按照维修价格的顺序排列,所以基本上按照选择的顺序返回数组中的商店对象。我可能不知道,任何想法都将不胜感激。提前感谢您的宝贵时间。

var vendors = [

  {
    mosShop: {
      samsung: {
        screen: 50,
        button: 10,
        back: 20
      },
      iphone: {
        screen: 10,
        button: 18,
        back: 1
      }
    }
  }, {
    davesShop: {
      samsung: {
        screen: 40,
        button: 5,
        back: 12
      },
      iphone: {
        screen: 18,
        button: 148,
        back: 11
      }

    }
  }


];
var arr = [];
//;
$('#phone,#repair').change(function() {



  var selectedPhone = $('#phone :selected').text().toString();
  var selectRepair = $('#repair :selected').text().toString();




  for (var i = 0; i < vendors.length; i++) {

    var mo = Object.keys(vendors[i]);
    var t = mo.toString()

    var price = vendors[i][t][selectedPhone][selectRepair];

    alert(price)


  }













});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<select id="phone">
  <option value="samsung">samsung</option>
  <option value="iphone">iphone</option>
  <option value="mercedes">blah</option>
  <option value="audi">blah</option>
</select>
<select id="repair">
  <option value="screen">screen</option>
  <option value="button">button</option>
  <option value="back">back</option>
  <option value="audi">blah</option>
</select>

<div id="endresults">

</div>

`

【问题讨论】:

  • 请添加结果数组的外观。
  • 你搜索了吗? [javascript] sort array objects nested property --- 其中之一一定有帮助。
  • 因为它在我的代码中,但按照选择的修复顺序 - 成本最低,所以如果 davesShop 较低,那么它应该首先出现在排序的对象数组中。

标签: javascript jquery arrays sorting object


【解决方案1】:

要得到按照selectedPhoneselectRepair的值排序的数组,可以像这样使用原生的sort()函数-

function shopPrices(selectedPhone, selectedRepair) {
    return vendors.sort(function(a,b) { 
        var shopA = Object.keys(a)[0];
        var shopB = Object.keys(b)[0];
        return (a[shopA][selectedPhone][selectedRepair] - b[shopB][selectedPhone][selectedRepair]);
    });
} 

然后您可以通过传递selectedPhoneselectedRepair 值来简单地调用该函数,如下所示-

var sorted = shopPrices('samsung','screen');
//Result -> [{"davesShop":{"samsung":{"screen":40,"button":5,"back":12},"iphone":{"screen":18,"button":148,"back":11}}},{"mosShop":{"samsung":{"screen":50,"button":10,"back":20},"iphone":{"screen":10,"button":18,"back":1}}}]

var anotherTest = shopPrices('iphone','screen');
//Result -> [{"mosShop":{"samsung":{"screen":50,"button":10,"back":20},"iphone":{"screen":10,"button":18,"back":1}}},{"davesShop":{"samsung":{"screen":40,"button":5,"back":12},"iphone":{"screen":18,"button":148,"back":11}}}]

希望这会有所帮助!

【讨论】:

  • 非常感谢您的帮助,花时间这正是我想要的。 p.s 缺少一个右花括号。
  • Object.keys(a).toString() 应该是 Object.keys(a)[0]。在数组上调用 toString() 并将结果用作属性名称是错误的。