如何找到要插入物件陣列的索引。
我有物件陣列。
var cordinate = [
[225, 242],
[405, 242],
[585, 242],
[765, 242],
[225, 325],
[405, 325],
[585, 325],
[765, 325],
[225, 408],
[405, 408],
[585, 408],
[765, 408]
]
在這里我想插入最近的元素
我想插入的陣列
var extraEle = [404, 260]
如何確定坐標中 extraEle 的確切索引。
這是我正在嘗試的
我正在比較 y 坐標以獲得最近的范圍,然后將 x 坐標與僅 y 范圍進行比較以獲得索引。
var yValue = [];
var diffVal = cordinate[0][1];
for(var i=0; i<cordinate.length;i ){
if (Math.abs(extraEle[1] - diffVal) > Math.abs(extraEle[1]- cordinate[i][1])){
diffVal = componentsPos[i][1];
}
}
var index;
yvalue = [];
for(var i=0; i<cordinate.length;i ){
if (cordinate[i][1] === diffVal){
yvalue.push(componentsPos[i]);
}
}
var diffValX = yvalue[0][0];
for(var i=0; i<yvalue.length;i ){
if (Math.abs(extraEle[0] - diffValX) > Math.abs(extraEle[0]- yvalue[i][0])){
diffValX = yvalue[i][0];
}
}
var indexValue = [diffValX,diffVal]
cordinate.indexOf(indexValue, 0)
我們可以有比這更好的方法嗎? 注意:此代碼是作業代碼。
在我的情況下,輸出將為2,因為 260( Y ) 將在前 4 個元素的范圍內,而 404 ( X ) 將在第三個元素之前。
添加我的坐標后應該是這樣的。
cordinate = [
[225, 242],
[405, 242],
[404, 260],
[585, 242],
[765, 242],
[225, 325],
[405, 325],
[585, 325],
[765, 325],
[225, 408],
[405, 408],
[585, 408],
[765, 408]
]
但確切地說,我只需要可以插入的索引。
uj5u.com熱心網友回復:
這可能不是最優雅的解決方案,但它會通過計算點之間的距離并確定最近的點來確定最近的坐標,然后您就可以將splice其放入陣列中。
// Input coordinates
let coordinates =
[
[225, 242],
[405, 242],
[585, 242],
[765, 242],
[225, 325],
[405, 325],
[585, 325],
[765, 325],
[225, 408],
[405, 408],
[585, 408],
[765, 408]
];
// Add this to the array
let extraEle = [404, 260];
getClosestIndex(coordinates, extraEle).then((result) => {
coordinates.splice(result, 0, extraEle);
console.log(coordinates);
// Output
/*[
[225, 242],
[405, 242],
[404, 260]
[585, 242],
[765, 242],
[225, 325],
[405, 325],
[585, 325],
[765, 325],
[225, 408],
[405, 408],
[585, 408],
[765, 408]
]; */
});
function getClosestIndex(coords, targetCoords) {
return new Promise((resolve, reject) => {
let shortestDist = 999999999;
let shortestIndex = 0;
coords.forEach((coord, index) => {
let dist = Math.sqrt( Math.pow((coord[0]-targetCoords[0]), 2)
Math.pow((coord[1]-targetCoords[1]), 2));
if (dist < shortestDist) {
shortestDist = dist;
shortestIndex = index;
}
});
// To add it after the closest element
if (shortestIndex < coords.length - 1)
shortestIndex = 1;
resolve(shortestIndex);
});
}
uj5u.com熱心網友回復:
我理解的邏輯是:
找到值最接近的子陣列,y然后X更準確。注意:OP 的所需輸出示例是錯誤的:
[405, 242], [404, 260], [585, 242],...
[404, 260]應該放在之前[405, 242]。
在下面的例子中:
- 2 陣列陣列是從 x 和 y 值創建的。
[[x, (x - 404)],...] and [[y, (y - 260)],...]
然后每個子陣列按索引 1 排序,并從中得出最接近的 [x, y]
let coords = [[225,242],[405,242],[585,242],[765,242],[225,325],[405,325],[585,325],[765,325],[225,408],[405,408],[585,408],[765,408]];
let add = [404, 260];
const findRange = (array, xy) => {
let xArr = [];
let yArr = [];
for (let sub of array) {
xArr.push([sub[0], Math.abs(xy[0] - sub[0])]);
yArr.push([sub[1], Math.abs(xy[1] - sub[1])]);
}
let xRng = xArr.sort((a, b) => a[1] - b[1]);
let yRng = yArr.sort((a, b) => a[1] - b[1]);
let X = xRng[0][0];
let Y = yRng[0][0];
let closest = [X, Y];
let idx = array.flatMap((s, i) => closest[0] === s[0] && closest[1] === s[1] ? i : []);
if (X >= xy[0]) {
array.splice(idx, 0, xy);
} else {
array.splice(idx 1, 0, xy);
}
return array;
};
console.log(findRange(coords, add));
uj5u.com熱心網友回復:
這是一個有趣的解決方案。
給定一個在陣列中找到最接近值的簡單函式,找到最接近的 Y 值。然后你所要做的就是將新坐標添加到陣列中,然后按 Y 和 X 列排序。排序新坐標時,將其 Y 值視為最接近的 Y 值。
let coords = [[225,242],[405,242],[585,242],[765,242],[225,325],[405,325],[585,325],[765,325],[225,408],[405,408],[585,408],[765,408]];
let add = [404, 260];
const closestValue = (array, goal) =>
array.reduce((prev, curr) =>
Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);
let nearestY = closestValue(coords.map(c => c[1]), add[1]);
coords.push(add);
coords.sort(function([a, b], [c, d]) {
if(b === add[1]){
b = nearestY;
} else if(d === add[1]){
d = nearestY;
}
return b - d || a - c
});
console.log(coords);
我相信排序可以改進。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/382271.html
標籤:javascript 数组 数据结构
上一篇:避免將重復的物件推送到角度陣列
