遍历包含对象的数组并对它们进行排序。

4

我有一个包含一些对象的数组,我正在尝试遍历该数组,其中数据按以下顺序存储:

firstName: Alice
lastName: Wonderland
age:12

我正尝试循环遍历,然后按降序排序,其中age:value应在第一位置,然后是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函数的行为。在循环过程中它应该如何工作?
有什么建议吗?

1
您关心内部属性顺序的原因是什么?您应该关心的是元素的顺序而不是它们的内部结构。 - Oscar Franco
1
已更新我的答案并附上演示。 - Salih Şenol Çakarcı
@ospfranco 没有什么原因,我只是想以正确的方式学习它。 - divisionkiller
@SalihŞenolÇakarcı 谢谢,我会检查你的解决方案。 - divisionkiller
在我看来,没有正确的方法来做这件事。在Java中,你可以使用OrderedHashMap,其中elements的顺序很重要,但是你所说的对象(读作“元素”)属性不应该因它们出现的顺序而有任何区别,我认为你的抽象层次需要再提高一个级别。 - Oscar Franco
@ospfranco 是的,我现在明白了,比以前清楚很多。谢谢你花时间帮助我,我非常感激! - divisionkiller
4个回答

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


这不是一个元素排序问题,正如所述,他关心的是属性的内部顺序,而不是包含它们的元素的顺序。 - Oscar Franco

1

对于非原始数据类型(自定义对象和数据结构)的数组排序需要两个步骤。这很直接了当,跟着做就行。

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

其次,您将此决策函数与您的数组一起提供给排序函数,它将使用它来为您对数组进行排序。让我们为您的情况做到这一点:

首先是比较函数,ab 是来自您自定义结构的对象。返回 1 表示对象 a 更“大”,返回 -1 表示b 更“大”,返回 0 表示根据您的标准,两者在“大小”上相等。下面 if 语句的顺序自然很重要,并反映了您所描述的优先级:

年龄优先于姓名,姓氏优先于名字。

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

祝你好运。


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

但是,根据描述,你试图做的事情没有意义,或者至少没有意义。


0

使用[].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)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接