我有一个哈希数组,如何获取数组中哈希集的位置?
在下面的示例中,我想找到某个位置在路径上的位置但是会导致“找不到”
var path = [{x: 42, y: 8}, {x: 42, y: 7}, {x: 42, y: 6}];
var location = {x: 42, y: 6};
var a = path.indexOf(location); // this result is -1
答案 0 :(得分:3)
那是因为location
对象和数组中的相应对象指向内存中的不同位置,并且JavaScript解释器认为它们不相等,即使{} === {}
导致{{1}这些是2个唯一的对象,但是:
false
请注意,数字等原始值不是这种情况。
对于过滤相应的对象,您应该遍历数组并将每个元素的x和y属性与var a = {}, b = a;
if (a === b) // true
对象的x和y属性进行比较,如:
location
答案 1 :(得分:1)
只需要添加到解决方案选项,您就可以使用Lodash或custom array find function来迭代集合并找到所需的对象。
function Point(x, y) {
this.x = x;
this.y = y;
}
Point.prototype = {
equal: function(point) {
if (point.x == this.x && point.y == this.y) {
return true;
}
return false;
}
}
point1 = new Point(6,1);
console.log([
new Point(4,0),
new Point(6,1),
new Point(8,12)].findIndex(
function(element, index, array){
return element.equal(point1);
}));
>> 1
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'fred', 'age': 40, 'active': false },
{ 'user': 'pebbles', 'age': 1, 'active': true }
];
// using the `_.matches` callback shorthand
_.findIndex(users, { 'user': 'fred', 'active': false });
// → 1
答案 2 :(得分:0)
这取决于你想要什么。如果您想与特定对象进行比较,那么您已经做得对了。例如:
var foo = { x: 1, y: 3 };
var not_foo = { x: 1, y: 3 };
var arrayOfThings = [foo, { x:3, y:4 }];
// this will work because foo is in there
var index = arrayOfThings.indexOf(foo);
// this will not work because not_foo is not in there
var fails = arrayOfThings.indexOf(not_foo);
如果你想找到一个相同的对象,你必须变得棘手。您可以使用underscore
这样的库,它同时具有适用的filter和find方法。你也可以使用类似的东西:
var foo = { x: 1, y: 3 };
var not_foo = { x: 1, y: 3 };
var arrayOfThings = [foo, { x:3, y:4 }];
arrayOfThings.forEach(function(obj){
if (obj.x == foo.x && obj.y == foo.y) {
// we found a match so do something I guess!
}
});