Чтобы найти коллизию в вашем сценарии, вам нужно выполнить итерацию по первому набору, и для каждого массива проверить, присутствуют ли какие-либо / некоторые элементы в другом наборе массивов.Вот код, который делает это:
let ships = [ {location:[13, 23, 33]}, {location:[2, 12, 22]}, {location:[15, 14, 16]}, {location:[17, 18, 19]}, {location:[31, 41, 51]}, {location:[40, 41, 42]} ]
let position = [{location: [22, 12, 22]},{location: [40, 41, 42]}]
// Compares if two arrays of numbers in this case are equal by making sure values
// at array indexes are equal
let isSameArray = (a,b) => a.every((number, index) => b[index] === number)
// Compares the sets by iterating over each of the elements inside and
// calling `isSameArray`
let contains = (a,b) => a.some(x => b.some(y => isSameArray(x.location, y.location)))
console.log(contains(ships, position)) // true
console.log(contains([{location:[22, 12, 22]}],[{location:[2, 12, 22]}])) // false
это в ES5
будет выглядеть так:
let ships = [ {location:[13, 23, 33]}, {location:[2, 12, 22]}, {location:[15, 14, 16]}, {location:[17, 18, 19]}, {location:[31, 41, 51]}, {location:[40, 41, 42]} ]
let position = [{location: [22, 12, 22]},{location: [40, 41, 42]}]
let isSameArray = function(arr1, arr2){
return arr1.every(function(number, index){
return arr2[index] === number
})
}
let contains = function(setA, setB){
return setA.some(function(objA) {
return setB.some(function(objB) {
return isSameArray(objA.location, objB.location)
})
})
}
console.log(contains(ships, position)) // true
console.log(contains([{location:[22, 12, 22]}],[{location:[2, 12, 22]}])) // false
Теперь этот код использует Array.some и Array.every , которые оба возвращают логическое значение в первом случае, указывая, что all
элементы соответствуют функции предиката, а во втором - хотя бы одно совпадение.
Вы также можете сделать это с вашим подходом, если вы включите фактическую функцию для сравнения числовых массивов location
:
let ships = [ {location:[13, 23, 33]}, {location:[2, 12, 22]}, {location:[15, 14, 16]}, {location:[17, 18, 19]}, {location:[31, 41, 51]}, {location:[40, 41, 42]} ]
let position = [{location: [22, 12, 22]},{location: [40, 41, 42]}]
let isSameArray = function(arr1, arr2){
return arr1.every(function(number, index){
return arr2[index] === number
})
}
let collision = function(arr1, arr2) {
for(var i = 0; i < arr1.length; i++) {
for(var j = 0; j < arr2.length; j++) {
if(isSameArray(arr1[i].location, arr2[j].location))
return true
}
}
return false
}
console.log(collision(ships, position)) // true