注:如何從屬性重要性百分比的JavaScript對象列表中選擇最相關的配置文件?
- 之前問這個問題,我看了一些計算器的問題,如How to determine equality for two JavaScript objects?但他們沒有我的情況下幫助,因爲我不希望檢查對象,但「相關性」之間的平等!
我需要
我在一個項目工作具有模塊應該建議零或一個配置文件(人)登錄的用戶。
保存在數據庫中的所有簡檔(除了登錄用戶&極限100 &選擇隨機地)經由API(http://example.com/suggest),爲JSON結果返回,並且每個簡檔的結構是這樣的:
{
name: <userName>,
age: <userAge | default 0>,
language: <userlanguage | default en>,
hobbies: <anArrayOfHobbies>
}
的OBJECTIF是建議當前登錄用戶的基礎上,「最相關的個人資料」:
屬性(在我的情況下,只有年齡,語言和愛好)。
該屬性對登錄的用戶有多重要。
例
比方說,API返回的結果如下:
,我們假設登錄的用戶擁有此配置文件
此用戶可以使用內部表單來搜索「最相關的配置文件」。這種形式讓他/她的每個財產的重要性的重要性百分比(SUM應該等於100%)。
- 案例1
我在尋找誰具有相同的年齡(最接近的一個)作爲我的個人資料。
預期的結果是{名稱: 「李四」,...}
- 案例2
在這種情況下,對我來說最重要的是語言。
預期的結果是{名稱: 「簡·羅伊」,...}
- 案例3
在這種情況下,最重要的是興趣愛好的數量與我分享個人資料
預期結果是{名稱:「Jane Doe」,...}
什麼已經做了
這是我已經開發了:
var Profile = {
\t name: "",
\t age: 0,
\t language: "en",
\t hobbies: [],
\t
\t getmostRelevantProfile: function(listOfProfiles){
\t \t var mostRelevantProfile = {
\t \t \t age: {value: null, profile: null},
\t \t \t language: [],
\t \t \t hobbies: []
\t \t };
\t \t listOfProfiles.forEach((profile)=>{
\t \t \t //console.info(profile);
\t \t \t //No need to check profile.name
\t \t \t
\t \t \t //Check relevent profile.age
\t \t \t var differencAgeBetweenMeAndCurrentProfile = this.age - profile.age;
\t \t \t if(differencAgeBetweenMeAndCurrentProfile<0){
\t \t \t \t differencAgeBetweenMeAndCurrentProfile *= -1;
\t \t \t }
\t \t \t var differencAgeBetweenMeAndmostRelevantProfile = this.age - mostRelevantProfile.age.value;
\t \t \t if(differencAgeBetweenMeAndmostRelevantProfile<0){
\t \t \t \t differencAgeBetweenMeAndmostRelevantProfile *= -1;
\t \t \t }
\t \t \t if(mostRelevantProfile.age.value === null || differencAgeBetweenMeAndCurrentProfile < differencAgeBetweenMeAndmostRelevantProfile){
\t \t \t \t mostRelevantProfile.age.value = profile.age;
\t \t \t \t mostRelevantProfile.age.profile = profile;
\t \t \t }
\t \t \t
\t \t \t
\t \t \t //Check if this profile speakes the same language as me
\t \t \t if(profile.language === this.language){
\t \t \t \t mostRelevantProfile.language.push(profile);
\t \t \t }
\t \t \t
\t \t \t //Check if I'm sharing some hobbies with this profile
\t \t \t if(this.hobbies.some((hobby)=>{
\t \t \t \t if(profile.hobbies.indexOf(hobby) > -1){
\t \t \t \t \t return true;
\t \t \t \t }
\t \t \t \t return false;
\t \t \t })){
\t \t \t \t mostRelevantProfile.hobbies.push(profile);
\t \t \t }
\t \t \t
\t \t });
\t \t
\t \t //If at least one profile saved, return it
\t \t if(mostRelevantProfile.age.value !== null){
\t \t \t return mostRelevantProfile;
\t \t }
\t \t return null;
\t }
}
var me = Object.create(Profile);
me.name = "John Doe";
me.age = 77;
me.language = "es";
me.hobbies = ["music", "boating", "cooking", "drawing"];
var johnRoe = Object.create(Profile);
johnRoe.name = "John Roe";
johnRoe.age = 20;
johnRoe.language = "fr";
johnRoe.hobbies = ["basebal"];
var janeDoe = Object.create(Profile);
janeDoe.name = "Jane Doe";
janeDoe.age = 43;
janeDoe.language = "de";
janeDoe.hobbies = ["stronomy", "music", "drawing"];
var janeRoe = Object.create(Profile);
janeRoe.name = "Jane Roe";
janeRoe.age = 76;
janeRoe.language = "es";
janeRoe.hobbies = ["stronomy", "music", "walking"];
var mostRelevantProfileForMe = me.getmostRelevantProfile([johnRoe, janeDoe, janeRoe], {age: 13, language: 64, hobbies: 23});
console.info("mostRelevantProfileForMe:", mostRelevantProfileForMe);
缺什麼(我的問題)
- 我怎樣才能添加重要性百分比選擇正確的配置文件,然後如何過濾
mostRelevantProfileForMe
只保留「正確的」配置文件?有沒有更好的方法來完成這項任務?
爲什麼不使用一組定義百分比的數組?例如Age_Difference = {0:100%,1:99%,2:98};等等,然後在其他方面做類似的事情,那麼你需要做的就是統計和引用數組?併爲業餘愛好,設置每個愛好的百分比重要性數組,計算總數,然後得分,然後創建您的百分比... – krisph
我不完全需要百分比在這裏? 「_對我而言最重要的是...... _」可以通過選擇重要性順序來完成:1. ...,2. ...,3. ... - 百分比如何影響選擇如果我已經設置了90%的語言?無論語言是否匹配... – Andreas
@andreas當我設置語言爲90%,並有2個配置文件。第一個和我說同一種語言,第二個和我的年齡相同,他們兩個都沒有發現愛好。結果應該是第一個配置文件,因爲90% –