【问题标题】:Find object index from array从数组中查找对象索引
【发布时间】:2018-02-10 10:48:27
【问题描述】:

我正在尝试从数组中找出选定的对象索引

但它总是返回 -1 不知道为什么?

这是我正在尝试做的事情

我有以下数组,其中它们是多个对象

var data = [{
  "name": "abc",
  "age": 25,
  "school": "xyz pqr"
},
{
  "name": "abc1",
  "age": 26,
  "school": "xyz pqr"
},
{
  "name": "abc2",
  "age": 27,
  "school": "xyz pqr"
}]

这是我的另一个用户选择的数组

var dList = [{
  "name": "abc",
  "age": 25,
  "school": "xyz pqr",
  "isChecked": true
}]

现在我想从数据数组中找出选定的对象索引并从该数组中删除该对象

if (dList.length > 0) {
  for (let i=0; i<dList.length; i++){
    delete dList[i]['isChecked']
    console.log(dList[i])
    console.log(data[0])
    console.log(dList[i] == data[0])
    let index = data.indexOf(dList[i]);
    console.log(index)
    data.splice(index, 1);
  }
}

【问题讨论】:

  • 如果 objA===objB,它必须具有相同的引用
  • 1.您正在从 dList 中删除 isChecked。 2. 您试图使用整个对象获取索引。识别对象的独特属性是什么?即:name?
  • 对象键中没有唯一标识,它每次都会更改,因此我试图找出整个对象索引。

标签: javascript jquery arrays indexof


【解决方案1】:

这里只是一个简单的实现:

if (dList.length > 0) {
  for (let i=0; i<dList.length; i++) {
    delete dList[i]['isChecked']
    console.log(dList[i])
    console.log(data[0])
    console.log(JSON.stringify(dList[i]) === JSON.stringify(data[0]))
    let index = data.findIndex(()=>dList[i]);
    console.log(index)
    data.splice(index, 1);
  }
}

可以通过使用JSON.stringify(ObjectName).将其转换为字符串来比较对象

第二次使用indexOf,而不是使用findIndexHereindexOffindIndex 的主要区别。

【讨论】:

【解决方案2】:

您只能比较两种基本类型,因此您将无法通过比较来获取对象的索引。

您应该比较一些主键,这些主键对于数组中的每个对象都是唯一的。

var data = [{
  "name": "abc",
  "age": 25,
  "school": "xyz pqr"
},
{
  "name": "abc1",
  "age": 26,
  "school": "xyz pqr"
},
{
  "name": "abc2",
  "age": 27,
  "school": "xyz pqr"
}];

var index = data.findIndex(x => x.name=="abc2");

console.log(index); 

【讨论】:

    【解决方案3】:

    这将满足您的需求,一个更通用的版本,如果您有唯一的 id,那将是最好的选择:

    var data = [{
            "name": "abc",
            "age": 25,
            "school": "xyz pqr"
        },
        {
            "name": "abc1",
            "age": 26,
            "school": "xyz pqr"
        },
        {
            "name": "abc2",
            "age": 27,
            "school": "xyz pqr"
        }
    ];
    var dList = [{
        "name": "abc",
        "age": 25,
        "school": "xyz pqr",
        "isChecked": true
    }];
    
    
    dList.forEach(function(obj) {
        delete obj.isChecked;
        data.splice(data.findIndex((o) => {
            return Object.getOwnPropertyNames(obj).every(p => obj[p] === o[p]);
        }), 1);
    });
    
    console.log(data);

    另一种方式:

    var data = [{
            "name": "abc",
            "age": 25,
            "school": "xyz pqr"
        },
        {
            "name": "abc1",
            "age": 26,
            "school": "xyz pqr"
        },
        {
            "name": "abc2",
            "age": 27,
            "school": "xyz pqr"
        }
    ];
    var dList = [{
        "name": "abc",
        "age": 25,
        "school": "xyz pqr",
        "isChecked": true
    }];
    
    
    dList.forEach(function(obj) {
        delete obj.isChecked;
        data.splice(data.findIndex((o) => o.name === obj.name && o.age === obj.age && o.school === obj.school && o.school === obj.school), 1);
    });
    
    console.log(data);

    不推荐的方式:

    var data = [{
            "name": "abc",
            "age": 25,
            "school": "xyz pqr"
        },
        {
            "name": "abc1",
            "age": 26,
            "school": "xyz pqr"
        },
        {
            "name": "abc2",
            "age": 27,
            "school": "xyz pqr"
        }
    ];
    var dList = [{
        "name": "abc",
        "age": 25,
        "school": "xyz pqr",
        "isChecked": true
    }];
    
    
    dList.forEach(function(obj) {
        delete obj.isChecked;
        data.splice(data.findIndex((o) => JSON.stringify(o) === JSON.stringify(obj)), 1);
    });
    
    console.log(data);

    【讨论】:

      【解决方案4】:

      你也可以用这个

      var data = [{
        "name": "abc",
        "age": 25,
        "school": "xyz pqr"
      },
      {
        "name": "abc1",
        "age": 26,
        "school": "xyz pqr"
      },
      {
        "name": "abc2",
        "age": 27,
        "school": "xyz pqr"
      }];
      
      var dList = [{
        "name": "abc",
        "age": 25,
        "school": "xyz pqr",
        "isChecked": true
      }]
      
      console.log(data.map(function(d){
      return d.name;
      }).indexOf(dList[0].name));

      【讨论】:

        【解决方案5】:

        您无法比较两个对象表示法 (JSON)。要比较两个 JSON,您需要先对对象进行字符串化,然后 JavaScript 可以为您比较这两个对象。

        这里有一个简单的代码,你可以得到你想要的。

        if (dList.length > 0) {
                    for(var i=0; i<data.length; i++){
                        for(var j=0; j<dList.length; j++){
                            delete dList[j]['isChecked'];
                            if(JSON.stringify(data[i]) === JSON.stringify(dList[j])){
                                let index = data.indexOf(data[i]);//Gets the index of the array
                                data.splice(index, 1);
                                console.log(data);
        
                            }else{
                                console.log('Data Not Matched in Array');
                            }
                        }
                    }
                }
        

        【讨论】:

        【解决方案6】:

        从某种意义上说,没有通用的方法来确定一个对象与另一个对象相等。请参阅 Equality comparisons 了解更多信息。

        您可以像下面这样查找和删除对象:

        Array.prototype.remove = function(elem) {
          var indexElement = this.findIndex(el => el.name === elem.name);
          console.log(indexElement);
          if (indexElement != -1)
            this.splice(indexElement, 1);
          return this;
        };
        
        data.remove(dList[0]);
        console.log(data);
        

        Online demo (jsFiddle)

        【讨论】:

          【解决方案7】:
          var result= data.filter((item, i, self) => {
            if (item.name === 'abc2') {
              return { itemIndex: i, obj: item }
            }
          });
          var output = result.map(r => { console.log(r.itemIndex) })
          console.log(output); 
          

          这将返回名称为abc2 的所有对象。 findIndex 数组方法将始终返回 1 个索引,但可能并非如此,因为人们可以有相同的名字。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-02-21
            • 1970-01-01
            • 1970-01-01
            • 2022-01-24
            相关资源
            最近更新 更多