比较对象数组中的项目

时间:2018-06-14 19:49:54

标签: javascript arrays object compare

我们说我有一系列对象:

 var array = [ 
   { id: 1, pt: 0 },
   { id: 2, pt: 12 },
   { id: 3, pt: 7 },
   { id: 4, pt: 45 },
   { id: 5, pt: 123 },
 ];

我想迭代数组(使用类似array.forEacharray.map的内容,并将每个项目中的pt属性与数组中其他项目的属性进行比较。我的目标是,对于每个项目,找到与该项pt值最接近的3个其他项目。例如。对于id: 1,值中最接近的项目是2,3和4.对于{{ 1}}它将是1,2和4等......我怎么能做到这一点?

2 个答案:

答案 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)