You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中寻找JSON数组最小平均差匹配项的工具库咨询

Finding the Most Matching Array in JavaScript (Minimizing Average Difference)

Great question! You're trying to locate the array in your JSON dataset that has the smallest average absolute difference from a test array. While you can absolutely build a vanilla JavaScript solution for this, there are several libraries that can streamline the process—especially if you might need more advanced similarity metrics down the line. Here are your top options:

1. Lodash

Lodash is a ubiquitous utility library in JS projects, and while it doesn't have a direct "average difference" function, its helper methods make assembling the logic clean and concise.

Example Usage:

const _ = require('lodash');

// Your test array (convert strings to numbers first)
const testArr = [73.0, 41.0, 98.0, 43.0];
// Sample JSON dataset
const data = {
  a: ["73.0", "41.0", "98.0", "43.0"],
  b: ["70.0", "45.0", "95.0", "40.0"],
  c: ["80.0", "35.0", "100.0", "45.0"]
};

// Function to calculate average absolute difference between two arrays
const calculateAvgDiff = (arr1, arr2) => {
  const numArr2 = arr2.map(Number);
  const differences = _.zipWith(arr1, numArr2, (x, y) => Math.abs(x - y));
  return _.mean(differences);
};

// Find the key with the smallest average difference
const bestMatch = _.minBy(Object.entries(data), ([key, arr]) => calculateAvgDiff(testArr, arr));

console.log(`Best match: ${bestMatch[0]} with array ${bestMatch[1]}`);

2. Math.js

Math.js is a dedicated library for mathematical operations, including statistical functions. It simplifies numeric conversions and calculations—perfect for your use case since your dataset arrays contain stringified numbers.

Example Usage:

const math = require('mathjs');

const testArr = [73.0, 41.0, 98.0, 43.0];
const data = {
  a: ["73.0", "41.0", "98.0", "43.0"],
  b: ["70.0", "45.0", "95.0", "40.0"],
  c: ["80.0", "35.0", "100.0", "45.0"]
};

const calculateAvgDiff = (arr1, arr2) => {
  // Convert string array to numbers and compute element-wise absolute differences
  const numArr2 = math.map(arr2, Number);
  const diffs = math.abs(math.subtract(arr1, numArr2));
  return math.mean(diffs);
};

let minDiff = Infinity;
let bestMatch = null;

for (const [key, arr] of Object.entries(data)) {
  const currentDiff = calculateAvgDiff(testArr, arr);
  if (currentDiff < minDiff) {
    minDiff = currentDiff;
    bestMatch = { key, arr };
  }
}

console.log(`Best match: ${bestMatch.key} with array ${bestMatch.arr}`);

3. TensorFlow.js

If you're working with very large datasets or might want to expand to more advanced similarity metrics (like cosine similarity) later, TensorFlow.js is a great choice. It handles vector operations efficiently, leveraging WebGL for performance if available.

Example Usage:

const tf = require('@tensorflow/tfjs');

const testArr = [73.0, 41.0, 98.0, 43.0];
const data = {
  a: ["73.0", "41.0", "98.0", "43.0"],
  b: ["70.0", "45.0", "95.0", "40.0"],
  c: ["80.0", "35.0", "100.0", "45.0"]
};

// Convert test array to a tensor
const testTensor = tf.tensor1d(testArr);

let minDiff = Infinity;
let bestMatch = null;

// Iterate through dataset
for (const [key, arr] of Object.entries(data)) {
  const numArr = arr.map(Number);
  const dataTensor = tf.tensor1d(numArr);
  
  // Calculate element-wise absolute difference, then average
  const diffMean = tf.mean(tf.abs(tf.sub(testTensor, dataTensor))).dataSync()[0];
  
  if (diffMean < minDiff) {
    minDiff = diffMean;
    bestMatch = { key, arr };
  }
  
  dataTensor.dispose(); // Clean up tensor to free memory
}

testTensor.dispose();

console.log(`Best match: ${bestMatch.key} with array ${bestMatch.arr}`);

Bonus: Vanilla JavaScript (No Libraries)

If you want to avoid adding dependencies, a simple vanilla JS implementation works perfectly for this use case:

const testArr = [73.0, 41.0, 98.0, 43.0];
const data = {
  a: ["73.0", "41.0", "98.0", "43.0"],
  b: ["70.0", "45.0", "95.0", "40.0"],
  c: ["80.0", "35.0", "100.0", "45.0"]
};

const calculateAvgDiff = (arr1, arr2) => {
  let totalDiff = 0;
  for (let i = 0; i < arr1.length; i++) {
    totalDiff += Math.abs(arr1[i] - Number(arr2[i]));
  }
  return totalDiff / arr1.length;
};

let minDiff = Infinity;
let bestMatchKey = '';
let bestMatchArr = [];

for (const [key, arr] of Object.entries(data)) {
  const currentDiff = calculateAvgDiff(testArr, arr);
  if (currentDiff < minDiff) {
    minDiff = currentDiff;
    bestMatchKey = key;
    bestMatchArr = arr;
  }
}

console.log(`Best match: ${bestMatchKey} with array ${bestMatchArr}`);

All these approaches will correctly identify the array with the smallest average difference, just like your example's "a" entry.

内容的提问来源于stack exchange,提问作者Sunny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:22:59