Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检查数组中是否存在具有特定属性的对象_Javascript_List_Search_Object - Fatal编程技术网

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

Javascript 检查数组中是否存在具有特定属性的对象,javascript,list,search,object,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] 这是真的吗 我已经访问了under

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

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

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]
这是真的吗

我已经访问了underline.js,它似乎有一些很好的处理方法,但我对如何实现它有点困惑

我在underline.js库中尝试了以下内容:

var isitso = _.find(M, function (i) { 
    return i.text == "your mom" && i.coords == [9,9];
});
在学习JS的这个阶段,我会很感激有很多不同的方法来解决这个问题。看看能做些什么,怎么做

提前谢谢

使用过滤方法

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

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

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

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

它应该会起作用。在本例中,您将检查前0个元素和后1个元素是否具有不比较数组对象本身的必需值。比较数字会比较值而不是引用

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

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

它应该会起作用。在本例中,您将检查前0个元素和后1个元素是否具有不比较数组对象本身的必需值。比较数字会比较值而不是引用

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

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

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

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

从未听说过下划线js,所以我无法谈论它的细节。大多数JavaScript框架都有一种或另一种类型的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还包含您首选的库中没有的东西


现在已经很晚了,我还没有把这段代码放到实际的浏览器中,但是这个想法是正确的,即使我打了个错字。

从来没有听说过下划线js,所以我不能谈论它的细节。大多数JavaScript框架都有一种或另一种类型的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还包含您首选的库中没有的东西


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

到目前为止,所有其他答案都使用第三方js库。下面是一个简单js解决方案的尝试。小提琴:


到目前为止,所有其他答案都使用第三方js库。下面是一个简单js解决方案的尝试。小提琴:


特定的术语和关键字不如良好的代码格式重要。请阅读有关如何使用降价来正确设置问题格式的常见问题解答。谢谢,请稍微整理一下。您展示的示例不起作用吗?它不起作用。将结果打印到控制台会带来一些关于js中使用的术语的注释。A={text:string,coords:[x,y]}是对象文本的实例化,而不是类。js中还没有类。沿着这些思路,如果你说A_i是A的实例化,那么A将是一个返回对象新实例的函数。看这把小提琴。特定的术语和关键字不如良好的代码格式重要。请阅读有关如何使用降价来正确设置问题格式的常见问题解答。谢谢,请稍微整理一下。您展示的示例不起作用吗?它不起作用。将结果打印到控制台会带来一些关于js中使用的术语的注释。A={text:string,coords:[x,y]}是对象文本的实例化,而不是类。js中还没有类。沿着这些思路,如果你说A_i是A的实例化,那么A将是一个返回对象新实例的函数。看这把小提琴。我看到一些专家已经通过了,所以在这个库中有一个更简单的方法来实现它。我将把这个答案留在这里,因为展示find-type方法是如何实现的可能会很有趣;我看到一些专家已经通过了,所以在这个库中有一个更简单的方法来实现它。我将把这个答案留在这里,因为展示find-type方法是如何实现的可能会很有趣
较好的好极了有没有一种方法可以检查数组的值相等,而不必将数组分解为其组件,然后再检查标量相等?@Psychycian-编写一个函数,在数组上迭代,检查每个值,只有当它通过两个数组的整体而没有发现差异时,才返回true。一个小的优化是在检查值之前首先检查它们的长度是否相同。您还可以在第一个差分上返回false,中止其余的比较。您不应该使用===而不是==?@ErikE-在这种情况下,第一个差分是字符串,坐标是整数,因此不会进行任何类型转换,因为它们属于同一类型。这正是您使用===的原因。要允许类型转换,请使用==。不希望允许类型转换时不使用===违反了最佳实践。你的逻辑完全颠倒了。太棒了。有没有一种方法可以检查数组的值相等,而不必将数组分解为其组件,然后再检查标量相等?@Psychycian-编写一个函数,在数组上迭代,检查每个值,只有当它通过两个数组的整体而没有发现差异时,才返回true。一个小的优化是在检查值之前首先检查它们的长度是否相同。您还可以在第一个差分上返回false,中止其余的比较。您不应该使用===而不是==?@ErikE-在这种情况下,第一个差分是字符串,坐标是整数,因此不会进行任何类型转换,因为它们属于同一类型。这正是您使用===的原因。要允许类型转换,请使用==。不希望允许类型转换时不使用===违反了最佳实践。您的逻辑完全是反向的。@Xymostech,是的,它不起作用,因为数组相等性不是这样工作的。我只是想强调一下u.filter函数。但现在它应该起作用了。检查这把小提琴:你为什么要强调u.filter函数?_u.find不够有效吗?@Xymostech,well-find返回第一个,filter返回所有匹配项。你挑吧@Xymostech,是的,它不起作用,因为数组相等性不是那样工作的。我只是想强调一下u.filter函数。但现在它应该起作用了。检查这把小提琴:你为什么要强调u.filter函数?_u.find不够有效吗?@Xymostech,well-find返回第一个,filter返回所有匹配项。你挑吧