【问题标题】:Comparing an object to an array of objects将对象与对象数组进行比较
【发布时间】:2015-02-10 16:07:06
【问题描述】:

我有一个 JavaScript 对象,我试图将它与一个对象数组进行比较:

var builtVehicle = {pattern: "../images/fire1192015.png", 
vehicle: "../images/van1192015.png", 
wheel: "../images/wheels3.png"};

var createdVehicles = [
{pattern:"../images/checkerboard1192015.png",       
vehicle:"../images/car1192015.png", wheel:"../images/wheels1.png"}, 
{pattern:"../images/fire1192015.png", vehicle:"../images/truck1192015.png",     
wheel:"../images/wheels4.png"},]

我正在尝试遍历 JavaScript 对象和 createdVehicles 对象数组以寻找精确匹配。如果没有完全匹配,我想将 builtVehicle 对象添加到 createdVehicles 数组中。我的想法是将数组中对象的每个键/值对与 builtVehicle 对象进行比较,但是我在提取数组中的键/值对时遇到了一些问题。我的循环如下所示:

for(var key in builtVehicle) {
    console.log('builtVehicle key: ' + key + '\n' + 'builtVehicle value: ' +     
builtVehicle[key]);
}


for(var b=0; b < createdVehicles.length; b++){
    alert(createdVehicles[b]);
}

这是最好的方法吗?我也在研究 2D 数组来实现这一点,但任何建议都值得赞赏。谢谢!

【问题讨论】:

  • “createdVehicles”数组没有.obj 属性;数组的每个索引元素都是一个对象。
  • 呃,嵌套循环?
  • 对,我并不是要在“createdVehicles”for 循环中包含 .obj 属性。 Bergi,我正计划在第一个循环中嵌套第二个循环,只是不确定哪种代码会将键值对从数组中拉出。
  • createdVehicles[b].vehiclecreatedVehicles[b].pattern 等,或者 createdVehicles[b][key],如果你正在使用 for ... in 循环。

标签: javascript arrays object for-loop


【解决方案1】:

我不能说这是最好的方法。最终,我会像@Brodie 所说的那样改变数据结构。否则你可以做这样的事情......

var builtVehicle = {
  pattern: "../images/fire1192015.png", 
  vehicle: "../images/van1192015.png", 
  wheel: "../images/wheels3.png"
};

var createdVehicles = [
{
  pattern:"../images/checkerboard1192015.png",       
  vehicle:"../images/car1192015.png", 
  wheel:"../images/wheels1.png"
}, 
{
  pattern:"../images/fire1192015.png", 
  vehicle:"../images/truck1192015.png",     
   wheel:"../images/wheels4.png"
}
];


var matchVehicle = function (vehicle, stack) {

  var i=0;

  for (i; i < stack.length; i+=1) {

      // if you have an id, thats even better because you don't have to test all of this, otherwise what makes it unique? a combo of everything?
      if ((vehicle.pattern === stack[i].pattern) && (vehicle.vehicle === stack[i].vehicle) && (vehicle.wheel === stack[i].wheel)) {
          return stack[i]; // returns the matching vehicle.
      }
  }
  // Will push the vehicle if it didn't match
  stack.push(vehicle);

};

console.log(matchVehicle(builtVehicle, createdVehicles));

【讨论】:

  • 谢谢查理,我能用你的方法得到支票!
【解决方案2】:

如果你可以改变数据结构,这样的事情可能会更好,这取决于你要对 createdVehicles 做什么以及它是否需要是一个数组。

// indexed by id of the vehicle, this could be a model number or something instead, but just need some identifying key for comparison.
// structure of item: { identifyingKey : vehicleObject }
createdVehicles = {
  1 : { ... },
  2 : { ... }
 }

if (!createVehicles.hasOwnProperty(builtVehicle.id)) {
  createdVehicles[builtVehicle.id] = builtVehicle;
}

如果您受制于约束,最好采用直截了当的方法并遍历数组。评论是正确的,旧的方式假设车辆是相同的基于一把钥匙。这里创建了一个函数来进行 ddper 对象比较,然后使用它来检查车辆数组中的匹配项。如果有匹配,我们就会中断,如果没有,则匹配保持为假,我们知道在循环结束时将其添加到数组中。这有点沉重和冗长,但是没有库,这应该可以工作。抱歉语法错误和其他东西,在工作中,所以尝试快速执行此操作。

//if you have access to underscore you can use _.size(obj) instead
// otherwise having access ot the size of the object helps, idk how people
// feel about touching the object protoype itself, but this is quick and dirty
Object.prototype.size = function(obj) {
  var size = 0, key;
  for (key in obj) {
    if (obj.hasOwnProperty(key)) size++;
  }
  return size;
};

var match = false;

var isVehicle = function(builtVehicle, testVehicle) {
  if (builtVehicle.size() !== testVehicle.size()) {
     return false;
  }

  for (key in builtVehicle) {
    if (!testVehicle.hasOwnProperty[key]) {
      return false;
    }
  }

  return true;
}

for (var i = 0, len = createdVehicles.length; i < len; i++) {
  var testVehicle = createdVehicles[i],
      match = isVehicle(builtVehicle, testVehicle);

   //if there was a match break out
   if (match) {
     break;
   }
}

if (!match) {
  createdVehicles.push(builtVehicle);
}   

由于人们提到了下划线,如果您可以访问它,您可以执行以下操作:

for (var i = 0, len = createdVehicles.length; i < len; i++) {
  var testVehicle = createdVehicles[i],
      match = _.isEqual(builtVehicle, testVehicle);

   //if there was a match break out
   if (match) {
     break;
   }
}

if (!match) {
  createdVehicles.push(builtVehicle);
}

【讨论】:

  • 这是考虑到车辆属性是唯一的id
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
相关资源
最近更新 更多