首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript如何比较两个数组并获取彼此最接近的值

Javascript如何比较两个数组并获取彼此最接近的值
EN

Stack Overflow用户
提问于 2022-04-04 14:06:03
回答 5查看 112关注 0票数 0

我有两个数组:

代码语言:javascript
复制
let arr1 = [6, 10, 7, 7] 
let arr2 = [6, 16, 20, 9]

arr1中的每个值代表问题的分数,其中arr2中的每个值代表问题的最大分数。所以这些值是相互关联的。例如,问题1得分为6分,最高分为6分,问题2给出最高得分为16分的10分。

现在,我想比较这些值,得到最接近彼此的3个值。所以在这种情况下,问题1: 6,6 (0差),问题2: 10,16 (差6),问题4: 7,9(差2),也许是按差异分类?

我怎样才能做到这一点?

EN

回答 5

Stack Overflow用户

发布于 2022-04-04 14:23:47

我将创建一个包含arr1、arr2和差异信息的新数组。如果这样做,排序和选择前3个元素变得非常简单:

代码语言:javascript
复制
let arr1 = [6, 10, 7, 7] 
let arr2 = [6, 16, 20, 9]

// create a new array with an object for each pair in arr1 and arr2
let zipped = []
for (let i = 0; i < arr1.length; i++) {
    zipped.push({
        score: arr1[i],
        max: arr2[i],
        diff: arr2[i] - arr1[i]
    })
}

// sort the array by diff
zipped.sort((a, b) => a.diff - b.diff)

// print out the first 3 elements
console.log(zipped.slice(0, 3))
票数 0
EN

Stack Overflow用户

发布于 2022-04-04 14:40:42

从上面的评论..。

“最接近的项目不是由最小差决定的,而是由最近/等于最大值1的商数决定的。

..。因此,我们可以选择一种基于reduce的方法,通过从每个数组的相应值中创建和收集评分项目,创建一个评分表,该方法具有取得的分数和可实现的分数。

排序就成了小菜一碟,因为每个评分项目都有以下特性. achievedachievablescoreDeltarating。建议按降序rating进行排序。但是,当然,OP总是可以按升序scoreDelta排序。

代码语言:javascript
复制
function createAndCollectRatedScoreItem({ achievables, result }, achieved, idx) {
  const achievable = achievables[idx];
  result.push({
    rating: achieved / achievable,
    achieved,
    achievable,
    scoreDelta: achievable - achieved,
  });
  return { achievables, result };
}
const achievedScoreList = [6, 10, 7, 7, 1];
const achievableScoreList = [6, 16, 20, 9, 2];

const ratedScoreList = achievedScoreList
  .reduce(
    createAndCollectRatedScoreItem,
    { achievables: achievableScoreList, result: [] }
  )
  .result
  .sort((a, b) => b.rating - a.rating);
 
const bestRatedScoreTripple = ratedScoreList.slice(0, 3);

console.log({ ratedScoreList, bestRatedScoreTripple });
console.log(
  'rated score list sorted by ascending score delta ...',
  ratedScoreList.sort((a, b) => a.scoreDelta - b.scoreDelta)
);
代码语言:javascript
复制
.as-console-wrapper { min-height: 100%!important; top: 0; }

另一种使代码可重用的方法是将map与其第二个thisArg parameter结合使用。

然后,上述代码示例的实现将稍微更改为..。

代码语言:javascript
复制
function createRatedScoreItemFromBoundAchievableScores(achieved, idx) {
  const achievable = this[idx];
  return {
    rating: achieved / achievable,
    achieved,
    achievable,
    scoreDelta: achievable - achieved,
  }
}
const achievedScoreList = [6, 10, 7, 7, 1];
const achievableScoreList = [6, 16, 20, 9, 2];

const ratedScoreList = achievedScoreList
  .map(
    createRatedScoreItemFromBoundAchievableScores,
    achievableScoreList
  )
  .sort((a, b) => b.rating - a.rating);
 
const bestRatedScoreTripple = ratedScoreList.slice(0, 3);

console.log({ ratedScoreList, bestRatedScoreTripple });
console.log(
  'rated score list sorted by ascending score delta ...',
  ratedScoreList.sort((a, b) => a.scoreDelta - b.scoreDelta)
);
代码语言:javascript
复制
.as-console-wrapper { min-height: 100%!important; top: 0; }

票数 0
EN

Stack Overflow用户

发布于 2022-04-04 17:11:52

首先,我要把每个问题的所有相关数据合并到一个对象中。我们可以使用一个组合数组,而不是两个单独的数组。根据操作后需要的信息,您可能希望在此对象中包含/省略某些信息。

如果您在操作后需要问题的索引,您可能需要提前存储它。如果您想根据最大分数和实际分数之间的差异进行排序,提前计算这个值会更快。

收集数据的一个非常简单的方法是使用map()

代码语言:javascript
复制
const combined = arr1.map((score, index) => {
  const max   = arr2[index];
  const diff  = max - score;
  const ratio = score / max;
  return { score, max, index, diff, ratio };
});

在收集了必要的数据之后,您可以根据您的标准对数组进行sort()。例如:

代码语言:javascript
复制
combined.sort((a, b) => a.diff - b.diff);

在对数据进行排序之后,您可以使用以下方法获取前3个元素。slice()

代码语言:javascript
复制
// Takes element 0 up to but not including 3 and put them in a new array.
const result = combined.slice(0, 3);
console.log(result);

或者,您也可以使用splice()来变异combined,删除所有不需要的元素。

代码语言:javascript
复制
// Removes all elements starting at element 3.
combined.splice(3);
console.log(combined);

代码语言:javascript
复制
const actualScores = [6, 10,  7, 7];
const maxScores    = [6, 16, 20, 9];

const scores = actualScores.map((score, index) => {
  const max   = maxScores[index];
  const diff  = max - score;
  const ratio = score / max;
  return { score, max, index, diff, ratio };
});

// sort by ratio descending
scores.sort((a, b) => b.ratio - a.ratio);
// take elements 0-3 (excluding) from `scores`
const scoresA = scores.slice(0, 3);

// sort by diff ascending
scores.sort((a, b) => a.diff - b.diff);
// take elements 0-3 (excluding) from `scores`
const scoresB = scores.slice(0, 3);

// remove all elements with index 3 or higher
scores.splice(3)

console.log("first 3 scores ordered by ratio descending",        scoresA);
console.log("first 3 scores ordered by diff ascending (slice)",  scoresB);
console.log("first 3 scores ordered by diff ascending (splice)", scores);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71738628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档