【问题标题】:Find an entire object in array of objects在对象数组中查找整个对象
【发布时间】:2017-04-15 01:33:44
【问题描述】:

如何在 Array1 中找到 Array2 。我一直在使用 $.inArray() 方法或 indexOf() 但它返回 false 但声明为 true。

var array1 = [{
    h: 1480508328,
    rid: 16,
    sid: 2
  }, {
    h: 87542,
    rid: 18,
    sid: 9
  }
];
var array2 = {
  h: 1480508328,
  rid: 16,
  sid: 2
};
//test if array2 exist in array1
if ($.inArray(array2, array1) > 0) {
  console.log('Object is in array');
} else {
  console.log('Object is not in array');
}

请帮忙。谢谢

【问题讨论】:

  • 仅供参考,array2 不是数组。它是一个对象。 array2 也不在array1 中,只是一个看起来array2 的对象。所以你必须iterate over array1 并检查是否有任何项目与array2 匹配。
  • 但是 var array1 是一个关联数组(取值)......不是吗?
  • 好吧....不。 To quote: "JavaScript 不支持带有命名索引的数组。在 JavaScript 中,数组总是使用编号索引。"*
  • @jamesOduro 在某种程度上你可以这么说,但我们不会在 JS 中称它们为关联数组,因为无法保证顺序。它们被称为对象。
  • Javascript 很奇怪,这就是我们所说的

标签: javascript jquery arrays


【解决方案1】:

您可以将其字符串化并检查是否相等

var array1 = [{
    h: 1480508328,
    rid: 16,
    sid: 2
  }, {
    h: 87542,
    rid: 18,
    sid: 9
  }
];
var array2 = {
  h: 1480508328,
  rid: 16,
  sid: 2
};

var dat1 = JSON.stringify(array2);
array1.forEach(function(item){
    if(JSON.stringify(item) === dat1){
        console.log(dat1)
    } else {
        console.log('Not match')
    }
});

JSFIDDLE

【讨论】:

  • 注意:如果对象的属性排序不同,可能会出现问题。
  • 出于某种原因帮助我的项目,我选择你的作为答案
  • 非常感谢。
【解决方案2】:

使用Array.prototype.every 检查数组的每个 对象属性是否与对象匹配 - 现在使用Array.prototype.some 检查数组中是否存在至少一次对象。

请看下面的演示:

var array1=[{h:1480508328,rid:16,sid:2},{h:87542,rid:18,sid:9}];
var object={h:1480508328,rid:16,sid:2}

var result = array1.some(function(e){
  return Object.keys(object).length === Object.keys(e).length && Object.keys(e).every(function(k){
    return k in object && e[k] === object[k];
  });
});

console.log(result);

【讨论】:

  • 什么是对象属性...你的意思是“键”吗??
  • object 与您的array2 相同
  • @james Oduro 对象具有属性,数组具有键,它们也是属性,因为数组是 JS 中的对象。然而,数组也可能具有不是键的属性。最好这样想。
【解决方案3】:

您可以迭代数组并使用给定对象的长度检查属性的长度并检查每个值。

var array = [{ h: 1480508328, rid: 16, sid: 2 }, { h: 87542, rid: 18, sid: 9 }],
    object = { h: 1480508328, rid: 16, sid: 2 },
    found = array.some(function (a) {
        var keys = Object.keys(a);
        return keys.length === Object.keys(object).length && keys.every(function (k) {
            return a[k] === object[k];
        });
    });
  
console.log(found);

var array = [{ h: 87542, rid: 18, sid: 9 }, { h: 1480508328, rid: 16, sid: 2 }],
    object = { h: 1480508328, rid: 16, sid: 2 },
    found = array.some(function (a) {
        var keys = Object.keys(a);
        return keys.length === Object.keys(object).length && keys.every(function (k) {
            return a[k] === object[k];
        });
    });
  
console.log(found);

【讨论】:

  • 我认为你的答案是最好的解决方案
  • yuvi提供的答案如果排序不一样就有大问题了..一个元素可以在位置1找到而不是在位置0
  • 那么如何返回找到的项目的位置?
  • @jamesOduro,没关系,因为检查了数组的所有元素。请参阅使用颠倒的项目进行编辑。
猜你喜欢
  • 1970-01-01
  • 2021-01-15
  • 2018-08-13
  • 1970-01-01
  • 2022-10-25
  • 2018-07-23
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
相关资源
最近更新 更多