循环遍历一组对象并对它们进行排序

时间:2017-01-29 11:58:28

标签: javascript arrays sorting

我有一个包含一些对象的数组,我试图遍历它,我按以下顺序存储数据:

firstName:爱丽丝
姓氏:仙境
年龄:12

我正在尝试循环,然后按降序对其进行排序,其中age: value应位于第一个位置然后> gt; lastName: Wonderland来了,最后是firstName。

这是我的代码,直到现在

var data = {
  example1: [{
    firstName: 'Alice',
    lastName: 'Wonderland',
    age: 12
  }],
  example2: [{
    firstName: 'Thomas',
    lastName: 'Mathison',
    age: 14
  }],
  example3: [{
    firstName: 'David',
    lastName: 'Jacobsen',
    age: 18
  }]
};

for (var key in data) {
  var arr = data[key];
  for (var i = 0; i < arr.length; i++) {
    var obj = arr[i];
    for (var prop in obj) {
      if (obj.hasOwnProperty(prop)) {
        console.log(prop + ': ' + obj[prop]);
      }
    }
  }
}

当我在console.log();中输出结果时,我希望实现相反的顺序(降序):

age: 12,
lastName: 'Wonderland',
firstName: 'Alice'

age:14,
lastName: 'Mathison',
firstName: 'Thomas'

age:18,
lastName: 'Jacobsen',
firstName: 'David'

我不确定sort函数的行为。在循环中它应该如何工作?

有什么建议吗?

4 个答案:

答案 0 :(得分:1)

使用[].unshift()方法

var result = [];
for (var key in data) {
  var arr = data[key];
  for (var i = 0; i < arr.length; i++) {
    var obj = arr[i];
    for (var prop in obj) {
      if (obj.hasOwnProperty(prop)) {
        result.unshift(prop + ': ' + obj[prop])
      }
    }
  }
}

console.log(result)

这里是demo https://plnkr.co/edit/N4Zt28zh0A3MpwoOrzmZ?p=preview

答案 1 :(得分:1)

var data = {
  example1: [{
    firstName: 'Alice',
    lastName: 'Wonderland',
    age: 12
  }],
  example2: [{
    firstName: 'Thomas',
    lastName: 'Mathison',
    age: 14
  }],
  example3: [{
    firstName: 'David',
    lastName: 'Jacobsen',
    age: 18
  }]
};
var objectArray=[];
for (var key in data) {
  var arr = data[key];
  for (var i = 0; i < arr.length; i++) {
    var obj = arr[i];
       objectArray.push(obj);
  }
}
 objectArray.sort(function(element1,element2){
   return element2.age - element1.age
}); //now iterate over the array it is sorted in descending order

答案 2 :(得分:1)

对非原始数据类型(自定义对象和数据结构,如您的情况)进行排序需要两个步骤。它很简单,所以请继续。

首先,您需要创建一个能够根据您所需的标准比较自定义数据结构的两个对象的函数。

其次,您将此决策函数与数组一起提供给sort函数,它将使用它为您排序数组。让我们为你的情况做:

首先,比较功能 a b 是自定义结构中的对象。返回1表示对象 a 是&#34;更大&#34;,返回-1表示 b 是&#34;更大&#34;,返回0表示,根据根据您的标准,两者在&#34;尺寸&#34;中是相等的。 if语句的顺序自然很重要,反映了您描述的优先级:

  

age优先于姓名,使用姓氏优先于名字。

function compare_people(a, b) {
  if (a.age < b.age) {
    return -1;
  }

  if (a.age > b.age) {
    return 1;
  }

  if (a.lastName < b.lastName) {
    return -1;
  }

  if (a.lastName > b.lastName) {
    return 1;
  }

  if (a.firstName< b.firstName) {
    return -1;
  }

  if (a.firstName> b.firstName) {
    return 1;
  }

  return 0;
}

现在你所要做的就是为javascript的排序功能提供你的标准和数组。在您的情况下,对象存储在data数组中,因此您可以:

data.sort(compare_people); 

完成,数组排序!

在这里,您可以更深入地研究这个概念https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

祝你好运。

答案 3 :(得分:1)

显然问题还不够明确,人们不断给你排序算法,我明白这不是你想要的,你想要改变属性的内部顺序(这没有意义,他们没有'顺序“他们是地图的一部分,无论如何,这就是我要做的事情:

var data = {
  example1: [{
    firstName: 'Alice',
    lastName: 'Wonderland',
    age: 12
  }],
  example2: [{
    firstName: 'Thomas',
    lastName: 'Mathison',
    age: 14
  }],
  example3: [{
    firstName: 'David',
    lastName: 'Jacobsen',
    age: 18
  }]
};

for (var key in data) {
  var arr = data[key];
  var newArr = [];
  for (var i = 0; i < arr.length; i++) {
    var obj = arr[i];
    newArr.push({
      age: obj.age,
      firstName: obj.firstName,
      lastName: obj.lastName
    })
  }
  data[key] = newArr;
}

但同样,你要做的事情毫无意义,或至少根据描述。