JavaScript:操纵两个数组

时间:2012-01-14 12:30:56

标签: javascript

我刚开始使用JavaScript,并迷失在如何处理这个问题上。

问题在于:

John,Ed,Sam,Alex和Mark分别为16岁,25岁,18岁,30岁和27岁。

我想使用数组和函数来输出五个中最小和最老的。

我试图形成两个数组,即

var Name = ['John', 'Ed', 'Sam', 'Alex', 'Mark']; 
var Age =  [16, 25, 18, 30, 27];

我发现很难操纵这些数组来获得所需的结果。

我如何对这些数组进行打印,以便打印出最年轻的人是约翰,最年长的人是亚历克斯?

5 个答案:

答案 0 :(得分:4)

您需要使用对象数组 - 例如

var People = [{ name : 'John', age : 16 }, .... ]

所以你可以保持年龄和名字在一起。然后使用具有自定义排序功能的排序功能

var PeopleSorted = People.sort( function( a, b ) { return a.age - b.age; });

PS。有关Array.sort的更多信息,请访问https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort

答案 1 :(得分:3)

您通常不会按照您所看到的方式构建数据结构 用它做任何事情都过于复杂。

var names = ['John', 'Ed', 'Sam', 'Alex', 'Mark']; 
var ages =  [16, 25, 18, 30, 27];

如果在某些假设的情况下你实际上不得不使用它,你可以这样规范化:

var people = names.map(function (name, i) {
    return {
        name: name,
        age: this[i]
    };
}, ages);

映射的结果与写入相同:

var people = [  
    {"name":"John","age":16},
    {"name":"Ed","age":25},
    {"name":"Sam","age":18},
    {"name":"Alex","age":30},
    {"name":"Mark","age":27} 
];

(是的,引用了属性名称,因为我用JSON.stringify对它进行了讨论,因为我懒惰了)

排序变得非常简单:

people.sort( function( a, b ) { return a.age - b.age; });

var youngestName = people[0].name,
    oldestName = people[people.length-1].name;

因此,如果您有控制权,请首先使用适当的结构。

答案 2 :(得分:1)

var names = ['John', 'Ed', 'Sam', 'Alex', 'Mark'],
    ages =  [16, 25, 18, 30, 27];

// reduce the ages array to an object containing youngest and oldest
var data = ages.reduce(function (memo, age, index) {
   // for every member in the age array
   // if the age is less then the youngest
   if (age < memo.youngest.age) {
       // then set that to be the youngest age
       memo.youngest.age = age;
       // and store the name by grabbing it from the names array by index
       memo.youngest.name = names[index];
   }
   // do the same for oldest
   if (age > memo.oldest.age) {
       memo.oldest.age = age;
       memo.oldest.name = names[index];
   }
   return memo;
// create a default seed for this object, 
// the default youngest age is infinite, the default oldest age is minus infinite
}, {
  youngest: {
    age: Infinity
  },
  oldest: {
    age: -Infinity
  }
});

// data object returned has the same format as the initial seed object
console.log(data.youngest.name);
console.log(data.oldest.name);

答案 3 :(得分:0)

var Name = ['John', 'Ed', 'Sam', 'Alex', 'Mark'];
var Age = [16, 25, 18, 30, 27];
var AgeFromName = {};
for (var i = 0; i < Age.length; i++) {
    AgeFromName[Age[i]] = Name[i];
}
Age.sort();
alert(AgeFromName[Age[0]]);

答案 4 :(得分:0)

您可以创建一个对象数组,其中每个对象都有nameage属性,这样您就可以按年龄对数组进行排序,从而轻松获得最年轻或最老的对象。这至少有一个其他答案,所以我在此不再重复。

既然你提到你刚开始使用JavaScript,你可能会喜欢一些循环遍历数组的一般练习,所以对于你在问题中定义的两个数组,如果你想要最年轻的人那么循环遍历age数组来找到最低年龄的位置,然后从名称数组中的相应位置输出名称:

function getYoungest(names, ages) {
   if (names.length != ages.length || names.length === 0)
       return ""; // stop if arrays were a different length or empty

   var i,
       y,
       a = Number.MAX_VALUE;

   for (i=0; i < ages.length; i++) {
      if (ages[i] < a) {
         a = ages[i];
         y = names[i];
      }
   }
   return y;
}

var Name = ['John', 'Ed', 'Sam', 'Alex', 'Mark'],
    Age =  [16, 25, 18, 30, 27];

console.log(getYoungest(Name, Age)); // 'John'

以上使用a来跟踪到目前为止的最低年龄,并使用y来保持该年龄段的名称,但当然您可以添加其他变量以同时跟踪到目前为止最高的年龄和相应的名称,以便您可以输出最年轻和最老的只有一次通过数组。

(当然,类似于上面的内容也适用于一个对象数组,如果你不想对数组进行排序,或者你正在寻找其他一些标准,那么排序对它们没有帮助。)< / p>