JS:如何获得关联数组的第一个N元素

时间:2015-05-08 20:40:27

标签: javascript

我有J Stsrutcure:

jobs = Job.where("state = ? and archive_time >= ?", 'approved', Time.now)
jobs.each {|job| job.archive }

我正在尝试编写一个将检索FIRST N元素的函数

前:

var rooms={};
rooms["room1"] = 10;
rooms["room2"] = 25;
rooms["room3"] = 15;
rooms["room4"] = 1;
rooms["room5"] = 10;
rooms["room6"] = 181;
rooms["somrthing"] = value;

如果limit = 3将返回一个Object,如:

function getElements(limit) {
..
}

(前三个要素:我不需要订购!)

4 个答案:

答案 0 :(得分:2)

function getTopElements(limit) {
    var newRooms = {};
    var i = 0;
    for(r in rooms) {
        if(i < limit) {
            newRooms[r] = rooms[r];
            i++;
        }
        else
            return newRooms;
    }
    return newRooms;
}

jsfiddle DEMO

答案 1 :(得分:0)

关联数组中没有顺序概念。您使用了错误的数据结构。如果你想跟踪顺序,那么你需要使用一个本质上跟踪顺序的数据结构,就像常规数组一样。

最有可能的是,您只想以下列方式将关联数组替换为数组:不使用字符串"room1"作为键,而是使用如下数组:

var rooms = [] 
rooms[1] = 10 //but maybe you want to start at 0 instead of 1
// because the array WILL have a 0 element

等。然后,您可以随心所欲地获得阵列中的第一个N项目。要返回rooms[1]中的任何值,只需拨打rooms[1]

您也可以跟踪房间的名称和与之关联的其他数字,如当前的关联数组,以及数据的存储顺序。在那种情况下,也许你想要的是某种房间物体。例如:

room1 = {
    room_number : 1, 
    other_number : 10, //I don't know what this number means in your code
} 

然后你可以用你喜欢的方式用这种对象填充数组rooms。一旦创建了上面的Room1对象,就可以将它推送到这样的数组:

rooms.push(room1);  

在这种情况下,订单可能意味着房间号以外的其他东西。这是你的判断。

答案 2 :(得分:0)

正如所有评论所指出的,现在有办法保证前三个&#34; JS中对象的属性,因为它在Object中没有固有的顺序。因此,如果您使用for (i in obj) {}循环并在其中放置一个计数器来跟踪您经历的循环次数,那么您可以停在3(例如),不同的浏览器可以返回三种不同的属性。

所以。 。 。尝试存储这样的数据。 。 。它类似于您正在使用的内容,并允许您更轻松地支持数据计算:

var rooms = [
    {room: "room1",
     number: 10},
    {room: "room2",
     number: "25"},
    {room: "room3",
     number: "15"},
    {room: "room4",
     number: "1"},
    {room: "room5",
     number: "10"},
    {room: "room6",
     number: "181"}
];

rooms[0].room会让你room1rooms[0].room等于10。 。 。在此之后尽可能多地循环,以获得下一个排队。

Alernately,如果&#34;房间 n &#34;值只是用来枚举值,你需要它们吗?你可以使用一个简单的数组:

var rooms = [10, 25, 15, 1, 10, 181];

有了这个,rooms[0]将等于10rooms[1]等于25等等。

在任何一种情况下,都可以轻松地循环(或slicing关闭)前三个条目。

答案 3 :(得分:0)

尝试在rooms对象的属性名称中使用最后“数字”的“地图”;过滤,在rooms循环中将选定的属性从res添加到新的for in对象

var value = 123;

var rooms = {};
rooms["room1"] = 10;
rooms["room2"] = 25;
rooms["room3"] = 15;
rooms["room4"] = 1;
rooms["room5"] = 10;
rooms["room6"] = 181;
rooms["somrthing"] = value;

var res = {};

var map = "123".split("");

for (var prop in rooms) {
  // if property name ends with "digit"; e.g., "1", "2", "3"
  if (prop.match(/\d$/) !== null 
         // if property name is within `map`
      && map.indexOf(prop.match(/\d/)[0]) !== -1) {
        // set `prop` at `res` with `prop` value
        res[prop] = rooms[prop];
  }
};

console.log(res);