繁体   English   中英

定义关联数组的最简单方法

[英]Easiest way to define associative array

我需要一个如下所示的数组:

[0: 0, 1: 1, 2: 2]

使用此代码:

var arr = [];

for(i=0; i<3; i++){
    arr[i] = i;
}

我的数组看起来像这样:

[0, 1, 2]

然后这些值将通过键更新,例如:

arr[0] = 2.5;
arr[1] = 8.4;
arr[2] = 3.7;
...

最后, arr 将按值排序,例如,我得到以下顺序:

[[0:2.5],[2:3.7],[1:8.4],...]

JavaScript 中没有关联数组的概念。 有对象,它们是键/值对的集合。 对象没有排序,因此无法排序。

如果你想保持秩序,我建议使用一个数组,它的元素本身就是包含索引和值的元组:

var array = [[0, 0], [1, 1], [2, 2]];

要更新值:

array[1][1] = 8.4;

您可以按值排序

var sorted_array = array.sort((a, b) => a[1] - b[1])

现在您可以获得与i “索引”相关联的值

sorted_array.find(elt => elt[0] === i)[1]

这种方法似乎比其他需要维护两件事的建议简单,一个是提供键/值对的对象,另一个是提供有序键列表的数组。

JavaScript 没有关联数组的概念。 你必须创建一个对象。

var arr = {};
for(var i=0; i<3; i++) {
    arr[i] = i;
}

您可以使用数组和对象来获取值和顺序等信息。

订单存储在 order 属性中,仍然可以通过(通常的数组)索引访问一个元素。

 function sort() { // get array and sort it and chnage order prop of objects array.map(function (a, i) { return { index: i, value: a.value }; }).sort(function (a, b) { return a.value - b.value; }).forEach(function (a, i) { array[a.index].order = i; }); } function getSortedValues() { var r = []; array.forEach(function (a) { r[a.order] = a.value; }); return r; } // build data structure var array = [2.5, 8.4, 3.7].map(function (a, i) { return { value: a, order: i }; }); sort(); document.write('<pre>' + JSON.stringify(array, 0, 4) + '</pre>'); // change a value array[2].value = 9.9; sort(); document.write('<pre>' + JSON.stringify(getSortedValues(), 0, 4) + '</pre>');

您可以保留两个数据结构:

  • 一个给你key => value访问的对象。
  • 为您提供订单的key数组。

您可以创建一个包装器对象来封装这两者并公开一个 API 来执行所需的操作(按键访问、排序、迭代等)。

您想要的是一个通用对象数组(工作笔),因为您似乎想要保留每个 Array 元素的原始索引。 基本上你像这样创建数组:

var arr = [];
var ARRAY_SIZE = 3;

for (var i=0, len = ARRAY_SIZE; i < len; ++i){
    arr[i] = { id : i, value : null };
}

像这样写值:

arr[0].value = 2.5;
arr[1].value = 8.4;
arr[2].value = 3.7;

然后像这样排序:

arr.sort(sort_function);
function sort_function (a, b)
{
  return a.value - b.value;
}

最好是明确的并命名您的属性 - 我选择了“id”而不是“原始索引”和“值”而不是隐含的匿名,但根据其在应用程序中的角色进行选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM