【问题标题】:Multidimensional array vs array of objects多维数组与对象数组
【发布时间】:2016-12-09 20:40:04
【问题描述】:

我正在构建一个运行基于代理的模型的房地产市场模拟,并且我想跟踪单个交易,以便我可以使用数据创建图形和图表并进行统计。我正在考虑使用一种我称之为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 是date,x 是house, askingPrice, soldPrice, daysOnMarket?您认为每种方法的优缺点是什么?

【问题讨论】:

  • 这取决于你。我个人会使用对象数组,但使用二维数组不一定是错误的。
  • @SpencerWieczorek 您认为每种方法的优缺点是什么?
  • 哪个对开发者更方便。
  • @SpencerWieczorek 确实,虽然实际用法相同,但两种方法背后的实际实现各不相同。我认为 OP 可能希望调查内存使用、时间复杂度和各种其他问题的影响。
  • 事实上,这将失败,gameDate 未定义 - 在这种情况下我也不会使用全局变量。

标签: javascript arrays oop object multidimensional-array


【解决方案1】:

您可以使用对象数组,以便我可以使用熟悉的动词函数来操作它们;像查找一样。可能有更多“纯” 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);
  }
};

【讨论】:

    猜你喜欢
    • 2013-04-18
    • 2015-12-30
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2012-01-03
    • 2018-12-18
    相关资源
    最近更新 更多