2017-02-10 21 views
1

我需要計算2個Javascript對象之間的匹配百分比。我怎樣才能做到這一點?如何計算2個Javascript對象之間的匹配百分比?

例子:

obj1={key1: "val1", key2: "val2", key3: "val3", key4: "val4"} 
obj2={key5: "val5", key6: "val6"} 
//result should be: 0% 


obj1={key1: "val1", key2: "val2", key3: "val3", key4: "val4"} 
obj2={key1: "val1", key2: "val2"} 
//result should be: 50% 
+2

匹配鍵或值的百分比? –

+2

你有什麼試過的?它出了什麼問題?人們願意幫助,而不是爲你做。 – jdmdevdotnet

回答

4

您還沒有具體指定如何計算這樣的百分比。有測量相似性百分比的兩個對象之間的至少四種不同的方式:

  • 在第一對象的鑰匙,可以在第二發現的百分比,
  • 在第一對象的值的百分比可以在第二個中找到,包括重複項,
  • 第一個對象中可以找到的第二個值中的百分比,不允許重複,並且
  • 中的{key:value}對的百分比在第二個對象中可以找到的第一個對象。

請注意,兩個對象的順序很重要,即使用(obj1,obj2)調用可能會產生與使用(obj2,obj1)調用不同的結果。

上面的第二個選項計算第二個對象中重複值的每個實例,從而可以返回高於100%的值,例如,比較{a:42}和{x:42,y:42}會返回200%。這可能初看起來似乎不合理,但基於如何定義計算在數學上是有效的。第三種選擇不允許使用這樣的重複項,比較{a:42}和{x:42,y:42}會返回100%。在任何一種情況下,第一個對象中的重複值都不會被計數,例如,在兩種情況下比較{a:42,b:42}和{x:42}會產生50%的結果。由於JavaScript對象不能有重複鍵,因此這些重複項對於上面的第一個和第四個選項不是相關的考慮因素。

下面的代碼片段演示了所有四種方法。

const obj1 = {a: 1, b: 2, c: 3, d: 3}; 
 
const obj2 = {a: 1, b: 1, e: 2, f: 2, g: 3, h: 5}; 
 

 
const keys = obj => Object.keys(obj); 
 
const toPct = a => 100/keys(a).length; 
 

 
const pctSameKeys = (a, b) => 
 
    keys(b).reduce((num,key) => 
 
    keys(a).indexOf(key) > -1 ? num + 1 : num, 0) * toPct(a); 
 

 
const pctSameValuesIncludingDuplicates = (a, b) => 
 
    keys(b).map(key => b[key]).reduce((num,v) => 
 
    keys(a).map(key => a[key]).indexOf(v) > -1 ? num + 1 : num, 0) * toPct(a); 
 

 
const pctSameValuesNoDuplicates = (a, b) => 
 
    Array.from(new Set(keys(b).map(key => b[key]))).reduce((num,v) => 
 
    keys(a).map(key => a[key]).indexOf(v) > -1 ? num + 1 : num, 0) * toPct(a); 
 

 
const pctSameProps = (a, b) => 
 
    keys(b).reduce((num,key) => 
 
    a[key] === b[key] ? num + 1 : num, 0) * toPct(a); 
 

 
console.log('obj1:', JSON.stringify(obj1)); 
 
console.log('obj2:', JSON.stringify(obj2)); 
 
console.log('% same keys:     ', pctSameKeys(obj1, obj2)); 
 
console.log('% same values, incl duplicates:', pctSameValuesIncludingDuplicates(obj1, obj2)); 
 
console.log('% same values, no duplicates: ', pctSameValuesNoDuplicates(obj1, obj2)); 
 
console.log('% same properties (k/v pairs): ', pctSameProps  (obj1, obj2));

下面的代碼片段顯示了基本完全一樣的東西,但被寫在一個更加實用的風格(但見this answer on the Computer Engineering site怎麼看我這裏的代碼可能會被重新寫入一個仍然起作用,但更易讀的樣式):

const obj1 = {a: 1, b: 2, c: 3, d: 3}; 
 
const obj2 = {a: 1, b: 1, e: 2, f: 2, g: 3, h: 5}; 
 

 
// x or X is key or value or key/value pair 
 

 
const getXs = (obj, getX) => 
 
    Object.keys(obj).map(key => getX(obj, key)); 
 

 
const getPctSameXs = (getX, filter) => 
 
    (objA, objB) => 
 
    (filter ? filter(getXs(objB, getX)) : getXs(objB, getX)).reduce(
 
     (numSame, x) => 
 
     getXs(objA, getX).indexOf(x) > -1 ? numSame + 1 : numSame, 
 
     0 
 
    )/Object.keys(objA).length * 100; 
 

 
const pctSameKeys  = getPctSameXs((obj, key) => key); 
 
const pctSameValsDups = getPctSameXs((obj, key) => obj[key]); 
 
const pctSameValsNoDups = getPctSameXs((obj, key) => obj[key], vals => [...new Set(vals)]); 
 
const pctSameProps  = getPctSameXs((obj, key) => JSON.stringify({[key]: obj[key]})); 
 

 
console.log('obj1:', JSON.stringify(obj1)); 
 
console.log('obj2:', JSON.stringify(obj2)); 
 
console.log('% same keys:     ', pctSameKeys  (obj1, obj2)); 
 
console.log('% same values, incl duplicates:', pctSameValsDups (obj1, obj2)); 
 
console.log('% same values, no duplicates: ', pctSameValsNoDups(obj1, obj2)); 
 
console.log('% same properties (k/v pairs): ', pctSameProps  (obj1, obj2));

5

這不是從你有限的例子應該究竟如何做人數量完全清楚,但我相信你的要求可以重新措辭:

哪些項目的百分比在obj1是否存在與obj2相等?

對於這一點,你可以簡單地計算:

var count = [0,0]; 
for(var key in obj1) { 
    count[1]++; // total count 
    if(obj2.hasOwnProperty(key) && obj2[key] === obj1[key]) { 
     count[0]++; // match count 
    } 
} 
var percentage = count[0]/count[1]*100+"%"; 

當然,如果你的規格是不同的,那麼這將不會是完全正確的,但它至少應該讓你在正確的去方向。

+1

你必須檢查'obj2'中的唯一密鑰! –

0

你的問題是關於細節。所以我會假設你想在1個Array對象中查找值,看看它們是否出現在第二個數組中。

您有兩種選擇。

1.)使用SQL - 將它們兩個轉換成表格,然後連接它們的值。內部連接只應該返回它們之間通用的東西,從而給你一個計數。使用HashMap - 將大數組轉換爲散列圖。遍歷小數組,看看小數組中的值是否存在於HashMap中。如果他們這樣做,那麼你可以保持運行計數。

3.)常規Array搜索 - 就像通常檢查數組一樣,您可以看到是否有匹配。

+1

你在哪裏看到一個數組? – scrappedcola

+2

SQL似乎相當矯枉過正o_O –

+0

我不這樣做,但它可以被轉換成一個。 –