我们说我有一系列对象:
var array = [
{ id: 1, pt: 0 },
{ id: 2, pt: 12 },
{ id: 3, pt: 7 },
{ id: 4, pt: 45 },
{ id: 5, pt: 123 },
];
我想迭代数组(使用类似array.forEach
或array.map
的内容,并将每个项目中的pt
属性与数组中其他项目的属性进行比较。我的目标是,对于每个项目,找到与该项pt
值最接近的3个其他项目。例如。对于id: 1
,值中最接近的项目是2,3和4.对于{{ 1}}它将是1,2和4等......我怎么能做到这一点?
答案 0 :(得分:2)
您可以映射过滤结果以排除枢轴元素并按绝对增量排序,并将所需数量作为结果。
function closest(n, { id, pt }) {
return array
.filter(o => o.id !== id)
.sort((a, b) => Math.abs(a.pt - pt) - Math.abs(b.pt - pt))
.slice(0, n);
}
var array = [{ id: 1, pt: 0 }, { id: 2, pt: 12 }, { id: 3, pt: 7 }, { id: 4, pt: 45 }, { id: 5, pt: 123 }],
result = array.map(o => Object.assign({}, o, { closest: closest(3, o) }));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:0)
首先让我们对数组进行排序:
array.sort((a, b) => a.pt - b.pt);
现在,最接近的元素位于元素之前或之后的某个位置。为了得到他们,可能只是前进和后退:
function getClosest(pos, n) {
let lower = pos - 1, upper = pos + 1;
const distance = i => Math.abs(array[pos].pt - array[i].pt);
const result = [];
while(result.length < n) {
if(lower >= 0 && distance(lower) < distance(upper)) {
result.push(array[lower--]);
} else if(upper < array.length) {
result.push(array[upper++]);
} else break;
}
return result;
}
现在获取第一个元素的5个最近的祖先:
getClosest(0, 5)