请记住,我还没有足够的词汇知道要搜索的关键词(现在只是跳上编码行列......),所以这可能是一个非常容易回答的问题!
我有一个对象数组,比如说
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的这个阶段,我会欣赏解决这个问题的许多不同方法。只是看看可以做什么以及如何做。
提前致谢!
答案 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!');
}