2017-04-05 53 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"] 
相关问题