Как уже отмечалось другими, вы можете не сравнивайте два уникальных объекта, сравнивая сами объекты, поэтому вам нужно сравнить их свойства. Вы можете сделать что-то подобное с помощью Array.prototype.some
, который является ECMA5, но его можно легко подкрепить.
Javascript
function indexOfCoordinates(array, object) {
var index = -1;
array.some(function (coordinate, arrayIndex) {
if (coordinate.x === object.x && coordinate.y === object.y) {
index = arrayIndex;
return true;
}
return false;
});
return index;
}
var coordinates = [
{x: 1, y: 2},
{x: 3, y: 4},
{x: 5, y: 6},
{x: 7, y: 8},
{x: 9, y: 0}
];
if (indexOfCoordinates(coordinates, {x: 5, y: 6}) !== -1) {
console.log("found");
}
if (indexOfCoordinates(coordinates, {x: 9, y: 1}) === -1) {
console.log("not found");
}
На jsfiddle
Или, как вы предложили, вы только хотите true
или false
, то вы можете еще больше упростить.
Javascript
function hasCoordinate(array, object) {
return array.some(function (coordinate) {
return coordinate.x === object.x && coordinate.y === object.y;
});
}
var coordinates = [
{x: 1, y: 2},
{x: 3, y: 4},
{x: 5, y: 6},
{x: 7, y: 8},
{x: 9, y: 0}
];
if (hasCoordinate(coordinates, {x: 1, y: 2})) {
console.log("found");
}
if (!hasCoordinate(coordinates, {x: 9, y: 1})) {
console.log("not found");
}
На jsfiddle
Это может быть дополнительно обобщена с использованием методов ECMA5 Object.keys
и Array.prototype.map
, вы должны, например, изменить ссылки x
и y
к a
и b
, или расширить свои координаты включить z
. Теперь ваша функция будет работать без изменения.
Javascript
function hasCoordinate(array, object) {
var objectKeys = Object.keys(object).sort(),
objectValues = objectKeys.map(function (value) {
return object[value];
});
return array.some(function (coordinate) {
var coordinateKeys = Object.keys(coordinate).sort(),
coordinateValues = coordinateKeys.map(function (value) {
return coordinate[value];
});
return coordinateKeys.toString() === objectKeys.toString() && coordinateValues.toString() === objectValues.toString();
});
}
var coordinates = [
{x: 1, y: 2},
{x: 3, y: 4},
{x: 5, y: 6},
{x: 7, y: 8},
{x: 9, y: 0}
];
if (hasCoordinate(coordinates, {x: 1, y: 2})) {
console.log("found");
}
if (!hasCoordinate(coordinates, {x: 9, y: 1})) {
console.log("not found");
}
На jsfiddle
Конечно, вы могли бы продолжать дальше по родовому пути, и даже ввести рекурсию.
if (coord.indexOf (searchFor)! = -1) // существует – madhairsilence
Вам нужно будет перебирать значения объекта в массиве, так как они представляют собой два отдельных объекта. Прямо сейчас вы ищете другой объект, который просто имеет одинаковые значения, поэтому он возвращает -1. –
Вы можете использовать внешнюю библиотеку, например, underscore.js? –