2017-08-14 58 views
0

我想我的基於給定的值的列表上的鍵..如何從值列表中獲取密鑰?

這裏我所期待的,

這是我的目標,

my_obj = { 
    "A": "a_id", 
    "B": "b_id", 
    "C": "c_id", 
    "D": "d_id", 
    "E": "status", 
    "F": "start_time", 
    "G": "end_time", 
    "H": "count", 
    "I": "task_desc", 
    "J": "approved", 
    "K": "point", 
    "L": "complex", 
    "M": "c_date", 
    "N": "final_date" 
} 
my_val = ['c_date', 'final_date', 'my_due_date', 'start_date'] 

所以,從上面的my_val我想要得到的,["M", "N"]

我試圖下劃線invert扭轉我的對象來獲取......一切都很好,除了返回鍵,而不是值..

這裏是我的嘗試,

my_obj = { 
 
    "A": "a_id", 
 
    "B": "b_id", 
 
    "C": "c_id", 
 
    "D": "d_id", 
 
    "E": "status", 
 
    "F": "start_time", 
 
    "G": "end_time", 
 
    "H": "count", 
 
    "I": "task_desc", 
 
    "J": "approved", 
 
    "K": "point", 
 
    "L": "complex", 
 
    "M": "c_date", 
 
    "N": "final_date" 
 
} 
 
my_val = ['c_date', 'final_date', 'my_due_date', 'start_date'] 
 
out = _.filter(my_val, function(v) { return _.invert(my_obj)[v]}) 
 
console.log(out)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

_.invert(my_obj)[v] - this gives me a `key` but inside filter didnt.. 

什麼是錯在我的代碼?如何得到它?

回答

5

您可以使用Object.keys來獲取一個鍵數組並根據每個鍵的相應值是否包含在my_val數組中; Array.prototype.includes()確定陣列是否包括某些元件,並返回與filter很好地適合的布爾值:

my_obj = { 
 
    "A": "a_id", 
 
    "B": "b_id", 
 
    "C": "c_id", 
 
    "D": "d_id", 
 
    "E": "status", 
 
    "F": "start_time", 
 
    "G": "end_time", 
 
    "H": "count", 
 
    "I": "task_desc", 
 
    "J": "approved", 
 
    "K": "point", 
 
    "L": "complex", 
 
    "M": "c_date", 
 
    "N": "final_date" 
 
} 
 
my_val = ['c_date', 'final_date', 'my_due_date', 'start_date'] 
 

 
console.log(
 
    Object.keys(my_obj).filter(k => my_val.includes(my_obj[k])) 
 
)

+0

@Psidom你能解釋一下嗎?爲了深刻理解?順便說一句很好的答案謝謝 –

1

這應該工作,你

my_obj = { 
 
     "A": "a_id", 
 
     "B": "b_id", 
 
     "C": "c_id", 
 
     "D": "d_id", 
 
     "E": "status", 
 
     "F": "start_time", 
 
     "G": "end_time", 
 
     "H": "count", 
 
     "I": "task_desc", 
 
     "J": "approved", 
 
     "K": "point", 
 
     "L": "complex", 
 
     "M": "c_date", 
 
     "N": "final_date" 
 
    } 
 

 
my_val = ['c_date', 'final_date', 'my_due_date', 'start_date'] 
 

 
var output = []; 
 

 
for (var i = 0; i < my_val.length; i++) { 
 
    for (var key in my_obj) { 
 
    if (my_obj[key] === my_val[i]) { 
 
     output.push(key); 
 
    } 
 
    } 
 
} 
 

 
console.log(output);

1

如果你只是想鍵的子集:

let subset = Object.keys(my_obj).filter((key, _) => 
    my_val.includes(my_obj[key]) 
); 
1

my_obj = { 
 
    "A": "a_id", 
 
    "B": "b_id", 
 
    "C": "c_id", 
 
    "D": "d_id", 
 
    "E": "status", 
 
    "F": "start_time", 
 
    "G": "end_time", 
 
    "H": "count", 
 
    "I": "task_desc", 
 
    "J": "approved", 
 
    "K": "point", 
 
    "L": "complex", 
 
    "M": "c_date", 
 
    "N": "final_date" 
 
} 
 
let my_val = ['c_date', 'final_date', 'my_due_date', 'start_date'] 
 
let result = []; 
 

 
for (let key in my_obj) 
 
{ 
 
    for (let i = 0; i < my_val.length; i++) 
 
    { 
 
    if (my_obj[key] == my_val[i]) 
 
    { 
 
     result.push(key); 
 
    } 
 
    } 
 

 
} 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

0

您錯誤地使用filter()。該方法需要回調函數返回一個布爾值,但在這裏你返回一個字符串。如果您想要爲my_val中的每個條目返回一個字符串(鍵),則應該使用map()代替。

+0

在這裏,我使用下劃線濾波器不是天然一個 –

+0

的文檔是相同的http: //underscorejs.org/#filter – gmferland