从JavaScript的关联数组/对象中获取特定元素

3

I have an array in JavaScript like this

var arr = [];
arr['5u'] = 250;
arr['1u'] = 120;
arr['7u'] = 670;
arr['2u'] = 210; //<-----
arr['9u'] = 850; //<-----
arr['8u'] = 129; //<-----
arr['3u'] = 382;
arr['6u'] = 391;
arr['4u'] = 432;

我想从索引为3到5的数组中仅获取3个元素。如何实现?结果应该像这样。
[210,850,129];

我尝试使用 arr[3] 访问它,当然,它显示为 undefined。现在该怎么办呢?

我想通过循环像这样访问值

for(var i=3; i<6; i++)
{
    console.log(arr[i]);
}

3
你只是在向数组对象添加属性,而不是将元素放入数组中。当你需要哈希结构时,请使用对象{}代替[] - xdazz
好吧,我原本也是这么想的,但是那样我就无法对它进行排序了。 - user3182138
你也不能对它进行排序。arr.sort(function(a, b) {return b - a}); 只会返回一个空数组。 - xdazz
3
不能仅依靠对象键进行排序。 - dfsq
1
那你最好建议一个好的。 - user3182138
显示剩余8条评论
8个回答

2
我建议你使用这种技术。
arr[0] = [250, '5u'];
arr[1] = [120, '1u'];
arr[2] = [670, '7u'];
arr[3] = [210, '2u'];
arr[4] = [850, '9u'];
arr[5] = [129, '8u'];
arr[6] = [391, '3u'];
arr[7] = [432, '6u'];

现在你可以像这样排序

arr.sort(function(a, b) {return b[0] - a[0]});

并且可以像这样访问任何元素

console.log(arr[3][0]);
console.log(arr[4][0]);
console.log(arr[5][0]);

这看起来很有前途。请让我试一下。 - user3182138
@CodeDevil 出于好奇,这个答案与我的有什么不同之处? - Ja͢ck
@Jack,一开始我只是喜欢这个答案,因为它正好符合我的要求。但当你问到你和这个答案之间的区别时,我想这个答案很简单且运行良好,但后来我进行了几个基准测试,发现这个答案比你的快得多。你可以自己尝试使用1000000次循环。这个答案大约需要4秒来排序数组,而你的则需要约10秒。 - user3182138
@CodeDevil 我不明白仅通过在每个元素内部反转值如何实现?你在jsperf.com上有基准测试吗? - Ja͢ck
稍等,我刚刚删除了。让我重新做一下。我非常感谢你的建议。请等一下。 - user3182138

1
我会以这种方式填充数组:
var arr = [], 
map = {},
append = function(key, value) {
    return arr[map[key] = arr.length] = [key, value];
}

append('5u', 250);
append('1u', 120);
append('7u', 670);
append('2u', 210); //<-----
append('9u', 850); //<-----
append('8u', 129); //<-----
append('3u', 382);
append('6u', 391);
append('4u', 432);
< p > map 结构允许您通过其标识符查找元素。

这样,您可以使用 arr.slice()

arr.slice(3, 6); // [['2u', 210], ['9u', 850], ['8u', 129]]

排序将保持键值对的关系:

arr.sort(function(a, b) {
    return a[1] - b[1]; // or reversed, whatever
});

请注意,在排序后,您将不得不重建地图;如果您实际上需要这种结构的话。

1

您可以按照以下方式创建自己的类数组的原型函数:

Array.prototype.selectIndex = function (n) {
          var count = 0;
          for (var i in arr) {
              if (count == n) val = arr[i];
              count++;
          }
          console.log(val);
      };

您可以像下面这样简单地输入索引号:

arr.selectIndex(3);
arr.selectIndex(4);
arr.selectIndex(5);

请看这个演示:DEMO

对象中的属性不一定有固定的顺序。 - Ja͢ck

1
You can use this way also

var arr = {};    
arr[0] = {'key':'5u','val':250};
arr[1] = {'key':'1u','val':120};
arr[2] = {'key':'7u','val':670};
arr[3] ={'key':'2u','val':210}; //<-----
arr[4] ={'key':'9u','val':850}; //<-----
arr[5] ={'key':'8u','val':129}; //<-----
arr[6] ={'key':'3u','val':382};
arr[7] = {'key':'6u','val':391};
arr[8] ={'key':'4u','val':432};
console.log(arr[3]['val']);
console.log(arr[4]['val']);
console.log(arr[5]['val']);

如果您正在使用对象,最好使用 {key: '5u', value: 250} - Ja͢ck

1

既然你已经为数组提供了键,那么你需要使用 arr['2u']arr['9u']arr['8u'] 来访问。你无法使用 arr[3] 进行访问,因为它没有被存储在这些索引中。


由于数组将被排序,因此不确定索引会是什么。这意味着我不确定是9u,8u还是其他什么元素。我只知道我想要获取某个索引编号的元素。 - user3182138
你知道你想要得到什么是什么意思?比如从第四个元素到第六个元素?我认为你应该解释得更清楚,因为Anirudh的回答只是你所问的问题,尝试重新表述一下。 - Lu Roman
你是根据数组的索引还是值进行排序? - anirudh

1
为了绝对安全,您将需要并行数据结构。您所描述的是一个映射而不是数组。问题在于映射是无序的,因此您不能依赖于放入其中的元素的顺序。您将需要一个相应的数组来跟踪顺序。请参见:JavaScript中的有序哈希

0

试试这段代码

 var arr = [], arr2 = [];
    arr['5u'] = 250;
    arr['1u'] = 120;
    arr['7u'] = 670;
    arr['2u'] = 210; //<-----
    arr['9u'] = 850; //<-----
    arr['8u'] = 129; //<-----
    arr['3u'] = 382;
    arr['6u'] = 391;
    arr['4u'] = 432;
    var count = 0;
    for(var i in arr){

        if(count == 3 || count == 4 || count == 5)
            arr2.push(arr[i]);
     count++;
    }

    console.log(arr2)

演示


你的答案很好,但是有没有直接通过索引访问它的方法,因为这样我们每次调用它都要从开头循环。如果数组有大约100000个值需要处理,并且只访问最后3个元素,那么效率就不会那么高了。 - user3182138
@Girish 哈哈,几乎和我的方法一样。如果你想要索引,可以将 i 值存储在第二个数组中,然后使用键来访问主数组,但我认为这没有意义,至少在你展示给我们的内容中。 - Lu Roman

0
var len = arr.length;
var data=new array();
var i=0;
while (len--){
    if(i==3) {
        data[i-3]=arr[i];
    }    
    i++;
    if(i==5){
        break;
    }
}

现在,您的数据数组将包含所需的值


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