检查数组中是否存在具有特定属性的对象

时间:2012-11-25 05:55:03

标签: javascript list search object

请记住,我还没有足够的词汇知道要搜索的关键词(现在只是跳上编码行列......),所以这可能是一个非常容易回答的问题!

我有一个对象数组,比如说

M = [A_1, A_2, ..., A_n]

,其中A_i是类

的实例化
A = {text: "string", coords:[x,y]}

我的问题是:检查我的数组M是否包含对象A_i的快速,优雅,简单的方法是什么

A_i.text="your mom" && A_i.coords = [9,9]

是真的吗?

我可以访问underscore.js,这似乎有一些很好的做法,但我对如何实现它有点困惑......

我尝试过的东西(使用underscore.js库)是:

var isitso = _.find(M, function (i) { 
    return i.text == "your mom" && i.coords == [9,9];
});

在学习JS的这个阶段,我会欣赏解决这个问题的许多不同方法。只是看看可以做什么以及如何做。

提前致谢!

6 个答案:

答案 0 :(得分:3)

您所拥有的难点是数组相等是引用相等(它们必须是相同的内存位置),而不是值相等(它们具有相同的值)。如果您将支票更改为:

      return i.text == 'your mom' && i.coords[0] == 9 && i.coords[1] == 9;

它应该有用。在这种情况下,您要检查第一个(0)和第二个(1)元素是否具有不比较数组对象本身的必需值。比较数字确实比较值而不是引用。

答案 1 :(得分:1)

您无法检查数组是否相等。您需要执行以下操作:

_.find(M, function (i) { 
    return i.text == "your mom" && i.coords[0] == 9 && i.coords[1] == 9;
});

答案 2 :(得分:0)

使用_.filter方法。

var filtered = _.filter(M, function(i) { return (i.text == "text2" && i.cords[0] == 3 && i.cords[1] == 4) });

答案 3 :(得分:0)

从未听说过下划线js,所以我不能说出它的细节。大多数javacript框架都有一种类型或类型的foreach方法,以模拟尚未标准化的foreach循环。

function findMatches(/* target array*/ target, /* matching function*/ match) {
   var dummy = [];
   dojo.forEach(target, function(t) {
        if (match(t)) {
            dummy.push(t);
        }
   });
   return dummy;
}

var allMatches = findMatches(M, function (m) {
    m.text == "your mom" && m.coords == [9,9]
});

请注意dojo.forEach是我使用的Dojo库中的forEach。 jQuery还包含你喜欢的库中没有这样的东西。

已经很晚了,我还没有把这个代码放在一个实际的浏览器中,但这个想法很合理,即使我写错了。

答案 4 :(得分:0)

到目前为止,所有其他答案都使用第三方js库。以下是对直接js解决方案的尝试。小提琴:http://jsfiddle.net/rNfph/

var M = [
    {text:'one', coord: [0,0]},
    {text:'two', coord: [1,1]},
    {text:'three', coord: [2,2]},
    {text:'four', coord: [3,3]},
    {text:'five', coord: [4,4]},
    {text:'six', coord: [5,5]},
    {text:'seven', coord: [6,6]},
    {text:'eight', coord: [7,7]},
    {text:'nine', coord: [8,8]},
    {text:'ten', coord: [9,9]}
];

var search = function(str, x, y){

    for(var i=0, len=M.length; i<len; i++){
        if( M[i].text === str && M[i].coord[0] === x && M[i].coord[1] === y ){
            return true;
        }
    }
    return false;

}

console.log( search('three', 2, 2) );
console.log( search('three', 1, 2) );

现在,带上一粒盐。我不是复杂的专家。很可能有更好的方法来实现这一点,因为这个实现需要迭代所有的值。

如果对“text”的值必须是唯一的限制,那么您可以将其全部构造为对象(字典)而不需要使用进行检查。任何迭代都可以。

看到这个小提琴:http://jsfiddle.net/4mrsh/

var M = {
    'one': [0,0],
    'two': [1,1],
    'three': [2,2],
    'four': [3,3]
}

var search = function(key, x, y){

    if( !M[key] || !(M[key][0] === x && M[key][1] === y) ) return false;

    return true;
}

console.log( search('three',2,2) ); //true
console.log( search('three',1,2) ); //false

答案 5 :(得分:0)

if (!Array.prototype.each) {
   Array.prototype.each = function(callback) {
      var i, l = this.length;
      for (i = 0; i < l; i += 1) {
         if (callback(i, this[i]) === true) return;
      }
   }
}

function anMHasYourMom(m) {
   var found;
   m.each(function(i, el) {
      return found = (
         el.text === "your mom"
         && el.coords[0] === 9
         && el.coords[1] === 9
      );
   });
   return found;
}

var M = [A_1, A_2, ..., A_n];
if (anMHasYourMom(M)) {
   window.alert('It has one!');
}