是否可以检查对象值的条件并返回密钥?

时间:2017-04-05 21:57:19

标签: javascript arrays ecmascript-6 javascript-objects

我在函数内部有一个字母和数字对象。这个函数接收一个数字数组,我运行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){
    }
  }
 });
}

有更简单的方法吗?

6 个答案:

答案 0 :(得分:3)

您可以使用Object.keysArray#find来获取匹配的key的{​​{1}}。



value




答案 1 :(得分: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'));

答案 2 :(得分: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']));

但是如果你经常这样做,那么倒置物体的其他答案会更好。

答案 3 :(得分: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"));

答案 4 :(得分: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来获取每个数组中的第二个元素,即原始数组中的值。

答案 5 :(得分: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"]