2017-04-05 51 views
0

我有一個函數內部的字母和數字對象。這個函數接受一個數組數組,並且我正在運行一個for循環,它遍歷該對象並檢查一個條件。如果數組中的任何數字與對象中的任何值匹配,則返回只需即可。是否可以檢查一個對象的值的條件,並返回鍵?

所以如果我通過switcher(['26']),它應該返回'a'。這可能嗎?

function switcher(x){ 
const letters = { 
    a: '26', 
    b: '25', 
    c: '24', 
    d: '23', 
    e: '22', 
    f: '21', 
    g: '20', 
    h: '19', 
    i: '18', 
    j: '17', 
    k: '16', 
    l: '15', 
    m: '14', 
    n: '13', 
    o: '12', 
    p: '11', 
    q: '10', 
    r: '9', 
    s: '8', 
    t: '7', 
    u: '6', 
    v: '5', 
    w: '4', 
    x: '3', 
    y: '2', 
    z: '1' 
}; 
} 

我試圖通過ES6 map()方法來做到這一點,但我不能確定爲要放什麼東西在我的if語句..這是我到目前爲止有:

return x.map(function(number){ 
    let keys = Object.keys(letters); 
    for(var key in letters){ 
    if(letters[key] === number){ 
    } 
    } 
}); 
} 

是有更簡單的方法來做到這一點?

+2

爲什麼不只是有陣倒過來,用數字作爲鍵和字母的價值?然後,在你的例子中,你可以簡單地請求'字母[26]',它會返回「a」,而不需要進一步搞亂。 – ADyson

回答

3

您可以使用Object.keysArray#find來獲得匹配的valuekey

const letters = {a:'26',b:'25',c:'24',d:'23',e:'22',f:'21',g:'20',h:'19',i:'18',j:'17',k:'16',l:'15',m:'14',n:'13',o:'12',p:'11',q:'10',r:'9',s:'8',t:'7',u:'6',v:'5',w:'4',x:'3',y:'2',z:'1'}; 
 

 
function switcher(num){ 
 
    var res = Object.keys(letters).find(v => letters[v] == num); 
 
    return res; 
 
} 
 

 
console.log(switcher('26')); 
 
console.log(switcher('9'));

+0

可能值得注意的是'.find'是ES6,所以它不適用於較舊的環境。 – loganfsmyth

+0

@loganfsmyth是的,它可能不適用於非常舊的瀏覽器,如IE7或任何其他。 –

+0

它不適用於任何版本的IE。 Edge是第一款支持它的微軟瀏覽器。你必須爲IE加載一個polyfill。 – loganfsmyth

2

我會建議只是交換鍵/值對,並與工作。

如果您希望代碼進行交換,您可以通過一次性操作(分配給numbers Map)執行此操作。這是ES6代碼:

const letters = {a:'26',b:'25',c:'24',d:'23',e:'22',f:'21',g:'20',h:'19',i:'18',j:'17',k:'16',l:'15',m:'14',n:'13',o:'12',p:'11',q:'10',r:'9',s:'8',t:'7',u:'6',v:'5',w:'4',x:'3',y:'2',z:'1'}; 
 
const numbers = new Map(Object.keys(letters).map(k => ([letters[k], k]))); 
 

 
console.log(numbers.get('26')); 
 
console.log(numbers.get('9'));

+0

@Kinduser,哈哈,哈哈;-) – trincot

1

您可以簡單地使用return key;

function switcher(x) { 
 
    const letters = { 
 
    a: '26', 
 
    b: '25', 
 
    c: '24', 
 
    d: '23', 
 
    e: '22', 
 
    f: '21', 
 
    g: '20', 
 
    h: '19', 
 
    i: '18', 
 
    j: '17', 
 
    k: '16', 
 
    l: '15', 
 
    m: '14', 
 
    n: '13', 
 
    o: '12', 
 
    p: '11', 
 
    q: '10', 
 
    r: '9', 
 
    s: '8', 
 
    t: '7', 
 
    u: '6', 
 
    v: '5', 
 
    w: '4', 
 
    x: '3', 
 
    y: '2', 
 
    z: '1' 
 
    }; 
 
    return x.map(function(number) { 
 
    let keys = Object.keys(letters); 
 
    for (var key in letters) { 
 
     if (letters[key] === number) { 
 
     return key; 
 
     } 
 
    } 
 
    }); 
 
} 
 
console.log(switcher(['26']));

但是,如果你要經常這樣做,其他的答案與倒立的物體是更好的。

1

也可以這樣做;

function switcher(x){ 
 
var letters = { 
 
    a: '26', 
 
    b: '25', 
 
    c: '24', 
 
    d: '23', 
 
    e: '22', 
 
    f: '21', 
 
    g: '20', 
 
    h: '19', 
 
    i: '18', 
 
    j: '17', 
 
    k: '16', 
 
    l: '15', 
 
    m: '14', 
 
    n: '13', 
 
    o: '12', 
 
    p: '11', 
 
    q: '10', 
 
    r: '9', 
 
    s: '8', 
 
    t: '7', 
 
    u: '6', 
 
    v: '5', 
 
    w: '4', 
 
    x: '3', 
 
    y: '2', 
 
    z: '1' 
 
    }; 
 
    for (var k in letters) if (letters[k] === x) return k; 
 
    return undefined; 
 
} 
 

 
console.log(switcher("14"));

0

我要去一個事實,即你正在使用,您可能需要不止一個結果數組搜索推定。例如,["26", "5"]應返回["a", "v"]

您可以用一行代碼做到這一點:

const letters = {a:'26',b:'25',c:'24',d:'23',e:'22',f:'21',g:'20',h:'19',i:'18',j:'17',k:'16',l:'15',m:'14',n:'13',o:'12',p:'11',q:'10',r:'9',s:'8',t:'7',u:'6',v:'5',w:'4',x:'3',y:'2',z:'1'}; 
 

 
const search = ["26", "5"]; 
 
const results = Object.entries(letters).filter(l => search.includes(l[1])).map(l => l[0]); 
 

 
console.log(results);

這是後ES6代碼。 (Array#includes是ES2016; Object.entries是ES2017)。然而,它很容易多元化。

Object.entries生成一個數組,其中對象的每個屬性都是格式爲[key, value]的數組中的元素,例如["a", "26"]。然後我們通過測試來過濾它們,看看我們的搜索數組includes的元素。然後我們使用Array#map來得到每個數組的第二個元素,即來自原始數組的值。

0

你甚至都不需要一個查找表letters(這是錯誤的方式圓了你的目的無論如何)。只需使用charCodeAtfromCharCode轉換字母與數字和背部:

function switcher(x) { 
    return x.map(function(code) { 
     return x > 0 && x <= 26 ? String.fromCharCode(123-x) : ""; 
    }); 
} 
console.log(switcher([26, 1])); // ["a", "z"] 
相關問題