Javascript 如何动态创建具有负索引的多维数组?

Javascript 如何动态创建具有负索引的多维数组?,javascript,multidimensional-array,Javascript,Multidimensional Array,在Javascript中,我有一个具有可变行数和列数的矩阵,我希望将其存储在多维数组中 问题是我需要额外的3列和3行,矩阵中也有负索引。因此,10x10矩阵的结果应该是索引从-3到9的13x13数组 我使用以下命令定义数组: var numberofcolumns = 10; var numberofrows = 10; var matrix = []; for (var x = -3; x < numberofcolumns; x++) { matrix[x] =

在Javascript中,我有一个具有可变行数和列数的矩阵,我希望将其存储在多维数组中

问题是我需要额外的3列和3行,矩阵中也有负索引。因此,10x10矩阵的结果应该是索引从-3到9的13x13数组

我使用以下命令定义数组:

  var numberofcolumns = 10;
  var numberofrows = 10;
  var matrix = [];
  for (var x = -3; x < numberofcolumns; x++) {
    matrix[x] = [];
  }
var numberofcolumns=10;
var numberofrows=10;
var矩阵=[];
对于(var x=-3;x

这样做对吗?或者有更好的方法吗?

虽然您可以创建负数属性,但Javascript的伪数组魔法也会丧失一些。特别是,
matrix.length
将仍然是10,即使它有13个元素。一般来说,阅读这些代码的人可能会感到惊讶

您最好定义一个偏移量,以便从数组索引中获取所需的值,反之亦然:

var offset = 3
for (var x=-3; x<numberofcolumns; x++) {
   matrix[x+offset] = []
}
var offset=3

对于(var x=-3;x虽然您可以创建负数属性,但您失去了一些Javascript的伪数组魔力。特别是,
matrix.length
即使有13个元素,也仍然是10。而且,一般来说,阅读该代码的人可能会感到惊讶

您最好定义一个偏移量,以便从数组索引中获取所需的值,反之亦然:

var offset = 3
for (var x=-3; x<numberofcolumns; x++) {
   matrix[x+offset] = []
}
var offset=3

对于(var x=-3;x我同意Mark Reed的观点,这是对数组的非直观使用。我认为一个子类是合适的。您可以按照教程对数组进行子类化,保留本机括号符号,并重写像length()这样的方法因此,它们给出了合理的值。子类化还有一个额外的优势,那就是让那些阅读您的代码的人清楚地知道,除了日常数组之外,还有一些事情正在发生。

我同意Mark Reed的观点,这是对数组的非直观使用。我认为子类是合适的。您可以按照教程对数组进行子类化,保持本机括号表示法和重写方法,如length()因此,它们给出了合理的值。子类化还有一个额外的优势,那就是让那些阅读您的代码的人清楚地知道,除了日常数组之外,还有一些事情正在发生。

您可以将矩阵定义为一个对象。例如,您将失去一些数组功能,但仍然可以访问
矩阵[-3]

  var numberofcolumns = 10;
  var numberofrows = 10;
  var matrix = {};
  for (var x = -3; x < numberofcolumns; x++) {
    matrix[x] = [];
  }
  for (x in matrix) {
    console.log(matrix[x]);
  }

演示:

您可以将矩阵定义为一个对象。例如,您将失去一些数组功能,但仍然可以访问
矩阵[-3]

  var numberofcolumns = 10;
  var numberofrows = 10;
  var matrix = {};
  for (var x = -3; x < numberofcolumns; x++) {
    matrix[x] = [];
  }
  for (x in matrix) {
    console.log(matrix[x]);
  }

演示:

谢谢,我现在明白了为什么我在尝试使用console.log()记录阵列时会得到如此有趣的结果。不过我并不真的喜欢使用偏移量,因为前3列应该在“正常”矩阵之外……谢谢,我现在明白了为什么我在尝试使用console.log()记录阵列时会得到如此有趣的结果但是,我并不喜欢使用偏移量,因为前3列应该在“正常”矩阵之外…
length
在JS中不是方法,而是原生
Array
实例的一个非常特殊的属性。最先进的是,你不能对JS数组进行子类化,你只能装饰实例。我链接的文章描述了谈到实例,我想我使用的是松散的语言。关于长度,你是对的,但我忘记了。
length
不是JS中的方法,而是原生
Array
实例的一个非常特殊的属性。最先进的是,你不能对JS数组进行子类化,你只能修饰实例。我链接的文章描述了修饰例如,我想我使用的是松散的语言。虽然你对长度的看法是对的,但我已经忘记了。你
matrix.length
期望是10还是13?你到底需要它吗?数组方法(不适用于负数索引)呢?你需要它们还是只对“可见”进行操作部分?如果没有,请考虑使用一个对象来确定它不是通常的数组。我更新了我的答案,检查它!你什么代码>矩阵?长度< /代码>期望是,10还是13?你需要它吗?什么数组方法(不适用于消极的缩写),你需要它们吗?或者你想要它们只在“可见”上操作吗?部分?如果没有,考虑使用一个对象来确定它不是通常的数组。我更新了我的答案,检查它!
console.log("Upper bound: " + matrix.LBound());
console.log("Lower bound: " + matrix.UBound());
console.log("Length: " + matrix.length());

matrix.forEach(function(item, index) 
    {
        if (item.val()) 
            console.log("Item " + index + " has the value \"" + item.val() + "\""); 
        else
            console.log("Item " + index + " contains " + item.length() + " items"); 
    });