多维数组 vs 对象数组

6
我正在建立一个房地产市场模拟,运行基于代理的模型,并希望跟踪个人交易,以便我可以使用数据创建图表和统计图表。我考虑使用一种名为Transaction的对象来实现这一点。
var Transaction = function(house, askingPrice, soldPrice, daysOnMarket) {
    this.date = gameDate
    this.house = house
    this.askingPrice = askingPrice
    this.soldPrice = soldPrice
    this.daysOnMarket = daysOnMarket
};

每次进行交易时,都会触发创建一个新的 Transaction 对象实例,并将其推送到 transArray 中:
transArray.push (new Transaction(house, askingPrice, soldPrice, daysOnMarket));

这是累积和存储数据的最佳方式吗?还是使用二维数组更好,其中y是日期,x是房屋、要价、售价、市场上的天数?您认为每种方法的优缺点是什么?


由你决定。我个人会使用对象数组,但使用二维数组也不一定是错误的。 - Spencer Wieczorek
@SpencerWieczorek,你认为每种方法的优缺点是什么? - snowfrogdev
无论对开发者来说哪种更方便。 - JstnPwll
@SpencerWieczorek 实际上,虽然两种方法的实际使用方式相同,但它们背后的实现方式是不同的。我认为 OP 可能想要调查内存使用、时间复杂度以及各种其他问题的影响。 - zeantsoi
就目前而言,这将因为gameDate未定义而失败 - 在这种情况下,我也不会使用全局变量。 - Mark Schultheiss
@SpencerWieczorek gameDate 在代码的其他地方已被定义。我只是提供了一个我计划做的示例,而不是整个模拟软件代码的全部内容。 - snowfrogdev
1个回答

4
你可以使用对象数组,以便我可以使用常见的动词函数进行操作,例如查找。可能有更多“纯”的Javascript方法来完成其中一些工作,但我还测试了lookup的速度,这种形式下速度不错。
这是从另一个答案复制过来的,它有一个更复杂的例子: Binding an array of objects to their specific form fields for updating/deleting 对于上面那个示例中的hasDuplicates函数,请注意,你可以轻松地在对象数组上支持它,如果你有多个对象数组,则可以在每个对象数组上重新使用函数。
var myApp = myApp || {};
myApp.arrayObj = {
  indexOf: function(myArray, searchTerm, property) {
    for (var i = 0; i < myArray.length; i++) {
      if (myArray[i][property] === searchTerm) return i;
    }
    return -1;
  },
  indexAllOf: function(myArray, searchTerm, property) {
    var ai = [];
    for (var i = 0; i < myArray.length; i++) {
      if (myArray[i][property] === searchTerm) ai.push(i);
    }
    return ai;
  },
  lookup: function(myArray, searchTerm, property, firstOnly) {
    var found = [];
    var i = myArray.length;
    while (i--) {
      if (myArray[i][property] === searchTerm) {
        found.push(myArray[i]);
        if (firstOnly) break; //if only the first 
      }
    }
    return found;
  },
  lookupAll: function(myArray, searchTerm, property) {
    return this.lookup(myArray, searchTerm, property, false);
  },
  remove: function(myArray, searchTerm, property, firstOnly) {
    for (var i = myArray.length - 1; i >= 0; i--) {
      if (myArray[i][property] === searchTerm) {
        myArray.splice(i, 1);
        if (firstOnly) break; //if only the first term has to be removed
      }
    }
  },
  removeByIndex: function(myArray, index) {
    myArray.splice(index, 1);
  }
};

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