如何 'reverse search' 为 JavaScript 中的对象中的 属性

How to 'reverse search' for a property in an object in JavaScript

你如何'reverse lookup'获取JavaScript中对象的属性?例如,假设我有一个对象:

var price = {
  water: '.00',
  beer: '.00',
  xbox: '0.00'
}

输入 price.water 将 return '.00'。但是,如果我想通过 PRICE 而不是通过项目的价格来查找 ITEM 怎么办?就像我可以输入 fnToFindItemByPrice('.00'),然后得到 'water'。这可能吗?

提前致谢。

您可以使用 Object.keys and Array.find:

var price = {
  water: '.00',
  beer: '.00',
  xbox: '0.00'
}


function findItemByPrice(item){
  return Object.keys(price).find(e => price[e] == item)
}

console.log(findItemByPrice('.00'))

如果你有多个属性的值,你可以使用Array.filter:

var price = {
  water: '.00',
  beer: '.00',
  xbox: '0.00',
  water2: '.00',
}


function findItemByPrice(item){
  return Object.keys(price).filter(e => price[e] == item)
}

console.log(findItemByPrice('.00'))

请记住,与键不同,值不是唯一的。

var price = {
  water: '.00',
  beer: '.00',
  coffee: '.00',
  xbox: '0.00'
};

var one_dollar = [];
for (let k in price) {
  if (price[k] === '.00') {
    one_dollar.push(k);
  }
}

console.log(one_dollar);

您可以使用 Object.entries() and a for ... of 循环来实现。您的代码将如下所示:

const price = {
    water: '.00',
    beer: '.00',
    xbox: '0.00'
}

for (const [key, value] of Object.entries(price)) {
    if (value === '.00') {
        console.log(key);
    }
}

如果您要有超过 1 个 .00 的值,例如 @mister wtf said, then you have to use Array.push 来获取此值。请参阅下面的示例:

let results = [];
let result;
const price = {
    water: '.00',
    sparklingWater: '.00',
    beer: '.00',
    xbox: '0.00'
}

for (const [key, value] of Object.entries(price)) {
    if (value === '.00') {
        results.push(key);
    }
}

if (results.length < 2) {
    result = results[0];
} else {
    result = results;
}

console.log(result);

希望对您有所帮助!

那个?

const f_reverse = obj => Object.entries(obj).reduce((r,[k,v])=>(r[v]=k,r),{})

const price = 
  { water : '.00'
  , beer  : '.00'
  , xbox  : '0.00'
  } 
const fruits =
  { apples  : 'normandy'
  , pears   : 'italy'
  , bananas : 'gabon'
  , oranges : 'california' 
  }  
const priceRev = f_reverse(price)
const products = f_reverse(fruits)

console.log( priceRev['.00'] )    // -> water
console.log( products.california )  // -> oranges

In case of multiple keys with the same value :

const f_reverse = obj => Object.entries(obj).reduce((r,[k,v])=>
    {
    if (!r.hasOwnProperty(v))       r[v] = k
    else if (!Array.isArray(r[v]))  r[v] = [ r[v], k ]
    else                            r[v].push(k)
    return r
    },{})

const price = 
  { water : '.00'
  , beer  : '.00'
  , xbox  : '0.00'
  , tacos : '.00'
  , glub  : '.00'
  } 
  
const priceRev = f_reverse(price)

console.log('.00->', priceRev['.00'])     // ['water','tacos','glub']
console.log('0.00->', priceRev['0.00']) //  'xbox' 
.as-console-wrapper {max-height: 100%!important;top:0 }

For those who always prefer to have an array back.
(in case of use by chaining plan to use a Nullish coalescing operator)

const f_reverse = obj =>
  Object.entries(obj).reduce((r,[k,v])=>(r[v]??=[],r[v].push(k),r),{})

const price = 
  { water : '.00'
  , beer  : '.00'
  , xbox  : '0.00'
  , tacos : '.00'
  , glub  : '.00'
  } 
  
const priceRev = f_reverse(price)

console.log('.00->', priceRev['.00'])     // ['water','tacos','glub']
console.log('0.00->', priceRev['0.00']) // ['xbox']
.as-console-wrapper {max-height: 100%!important;top:0 }