2016-11-10 110 views
-2

我試圖通過survey_id返回訪問者尚未投票的調查。使用下面的示例數組,我期望survey_id:4被返回。使用lodash返回一個唯一值數組,同時刪除非唯一的

完成此操作的最佳方法是什麼?

這裏是我的示例陣列:

// Survey Object 
 
[{ 
 
    survey_id: 1, 
 
    name: 'Survey 1", 
 
    question: "This is a survey question" 
 
}, { 
 
    survey_id: 2, 
 
    name: 'Survey 2", 
 
    question: "This is a another survey question" 
 
}, { 
 
    survey_id: 3, 
 
    name: 'Survey 3", 
 
    question: "This is a another 3 survey question" 
 
}, { 
 
    survey_id: 4, 
 
    name: 'Survey 4", 
 
    question: "This is a another 4 survey question" 
 
}] 
 

 
// Votes 
 
[{ 
 
    vote_id: 11, 
 
    visitor_token: "aDe4GggAe3", 
 
    survey_id: 1 
 
}, { 
 
    vote_id: 12, 
 
    visitor_token: "aDe4GggAe3", 
 
    survey_id: 2 
 
}, { 
 
    vote_id: 13, 
 
    visitor_token: "aDe4GggAe3", 
 
    survey_id: 3 
 
}]

+1

使用[differenceBy(https://lodash.com/docs/#differenceBy):'_.differenceBy(調查,投票, 'survey_id')' –

回答

2

接受的答案具有爲O(n^2)時間複雜度。 如果性能很重要,應避免嵌套在一起的線性操作 - 如果贊成簡單的代碼,@ S.D.的答案更清晰。這是一個帶有vanilla JavaScript和線性時間O(n)複雜性的版本。

function surveysWithNoVotes(surveyList, voteList) { 
    var surveyIds = surveyList.map(function(survey) { 
    return survey.survey_id 
    }) 
    var votedForIdsMap = voteList.reduce(function(memo, vote) { 
    memo[vote.survey_id] = vote.survey_id 
    }, {}) 
    return surveyIds.filter(function(id) { 
    return !votedForIdsMap[id] 
    }) 
} 
+1

我是新編程並且不熟悉O(n^2),在做了一些研究以理解它之後,我發現你是正確的。我已將您的答案轉換爲已接受的答案。 –

0

你可以使用的_.filter_.find的組合來過濾功能應用到您的收藏調查顯示,當匹配survey_id在票收集發現過濾掉的調查。見這個樣本getUnansweredSurveys功能:

function getUnansweredSurveys(surveys, votes) { 
    return _.filter(surveys, function(survey) { 
    return !_.find(votes, {survey_id: survey.survey_id}) 
    }) 
}