json 在object [duplicate]数组中找不到匹配对象的索引

v8wbuo2f  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(94)

此问题在此处已有答案

How to determine equality for two JavaScript objects?(82回答)
12天前关门了。
我有一个数据

var data = {
  "variants": [{
      "quantity": "20",
      "varientId": 8,
      "currency": "YEN",
      "extraField": {
        "Size": "10",
        "Color": "Red",
        "Material": "Denim"
      },
      "price": "199"
    },
    {
      "quantity": "15",
      "varientId": 10,
      "currency": "YEN",
      "extraField": {
        "Size": "9",
        "Color": "Red",
        "Material": "Denim"
      },
      "price": "249"
    },
    {
      "quantity": "18",
      "varientId": 12,
      "currency": "YEN",
      "extraField": {
        "Size": "8",
        "Color": "Green",
        "Material": "Rubber",
      },
      "price": "279"
    }
  ]
}

字符串
和对象:

var obj = {
        "Size": "10",
        "Color": "Red",
        "Material": "Denim"
      }


我试过这个

var index = null

for(var l = 0; l<data.variants.length; l++){
  if(data.variants[l].extraField === obj){
     index = l  
  } 
}

console.log(index)


我也试过使用JSON.stringify

JSON.stringify(data.variants[l].extraField) === JSON.stringify(obj)


当控制台记录索引变量时,我得到null,但我应该得到0,因为obj对象匹配第一个变量的extrafield。

nwlls2ji

nwlls2ji1#

您当前的方法不起作用的原因是,您试图使用===直接比较两个对象,这对对象不起作用。在JavaScript中,对象通过引用进行比较,而不是通过它们的内容进行比较,因此即使两个对象具有相同的键值对,它们也不会被认为是相等的,除非它们在内存中是相同的对象。
要查找数组中匹配对象的索引,可以使用JSON.stringify()方法比较对象的字符串化版本。然而,有一种更有效和直接的解决方案,使用循环并比较各个属性。以下是您的问题的最简单解决方案:

var data = {
  // Your data object here...
};

var obj = {
  // Your obj object here...
};

var index = null;

for (var l = 0; l < data.variants.length; l++) {
  var extraField = data.variants[l].extraField;
  var isEqual = true;

  for (var key in obj) {
    if (extraField.hasOwnProperty(key) && extraField[key] !== obj[key]) {
      isEqual = false;
      break;
    }
  }

  if (isEqual) {
    index = l;
    break;
  }
}

console.log(index);

字符串
这段代码将正确地找到data.variants数组中与obj对象的属性匹配的第一个对象的索引。它循环遍历每个变量,逐个比较属性,一旦找到匹配的变量就跳出循环,将索引赋给index变量。

ig9co6j1

ig9co6j12#

object与===的比较实际上是不起作用的,因为它们是不同的对象,并且您正在比较对它们的引用。或者,您可以使用shallow comparison,检查每个属性。但是在这种情况下,通过JSON.stringify进行比较是正确而简单的解决方案,并且它可以工作。通过运行此代码,控制台中将显示数字0,这是所需对象的索引。

var data = {
  "variants": [{
      "quantity": "20",
      "varientId": 8,
      "currency": "YEN",
      "extraField": {
        "Size": "10",
        "Color": "Red",
        "Material": "Denim"
      },
      "price": "199"
    },
    {
      "quantity": "15",
      "varientId": 10,
      "currency": "YEN",
      "extraField": {
        "Size": "9",
        "Color": "Red",
        "Material": "Denim"
      },
      "price": "249"
    },
    {
      "quantity": "18",
      "varientId": 12,
      "currency": "YEN",
      "extraField": {
        "Size": "8",
        "Color": "Green",
        "Material": "Rubber",
      },
      "price": "279"
    }
  ]
}

var obj = {
  "Size": "10",
  "Color": "Red",
  "Material": "Denim"
}

var index = null

for (var l = 0; l < data.variants.length; l++) {
  const isEqual = JSON.stringify(data.variants[l].extraField) === JSON.stringify(obj)
  if (isEqual) {
    index = l
  }
}

console.log(index)

字符串

相关问题