2

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

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

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 的这个阶段,我希望有许多不同的方法来解决这个问题。只是看看可以做什么以及如何做。

提前致谢!

4

6 回答 6

3

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

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

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

于 2012-11-25T06:10:36.280 回答
1

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

_.find(M, function (i) { 
    return i.text == "your mom" && i.coords[0] == 9 && i.coords[1] == 9;
});
于 2012-11-25T06:11:00.397 回答
0

使用 _.filter 方法。

var filtered = _.filter(M, function(i) { return (i.text == "text2" && i.cords[0] == 3 && i.cords[1] == 4) });
于 2012-11-25T06:09:05.627 回答
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 还包含你喜欢的库所没有的这种东西。

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

于 2012-11-25T06:11:07.263 回答
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

​</p>

于 2012-11-25T06:49:19.430 回答
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!');
}
于 2012-11-25T19:12:23.530 回答