dharmesh singh
dharmesh singh

Reputation: 121

Get key from object of value

I am trying to get the key from the value of the Object. I have the following array:

["Test 91", "Test 92", "Demo 1", "Demo 2"]

And I have one object:

{
    D123_EMG: {
        value: "Test 91", 
        isArchived: true
    }
    D21: {
        value: "Test 92", 
        isArchived: false
    }
    Z6200_EMO: {
        value: "Demo 1", 
        isArchived: true
    }
    G211_GTH: {
        value: "Demo 2", 
        isArchived: false
    }
}

So how can I get key as D123_EMG if the value is Test 91?

I tried this, but not getting proper response

    var data = Object.keys(objectData);
    var keys = []
    for(var i = 0; i < array.length; i++){
        for(var j = 0; j < data.length; j++){
            if(array[i] === objectData[data[j].value) {
                keys.push(objectData[data[j])
            }
        }
    }

Also, can it be optimized since I used two loops or one-liner approach?

Upvotes: 1

Views: 104

Answers (4)

Nick Olsen
Nick Olsen

Reputation: 1

If you're experiencing this problem in a state management store, then this is a sign that the store is not properly designed. Without more information, I can't really recommend an improvement on how to redesign your state.

So, barring a redesign of your state, you may consider creating a map by value like so:

const byValue = Object.keys(data).reduce((accumulator, currentKey) => {
  const currentObject = data[currentKey];
  currentObject.key = currentKey;
  accumulator[currentObject.value] = currentObject;
  return accumulator;
}, {});

This produces a map that looks like this:

{
  "Test 91": { "value": "Test 91", "isArchived": true, "key": "D123_EMG" },
  "Test 92": { "value": "Test 92", "isArchived": false, "key": "D21" },
  "Demo 1": { "value": "Demo 1", "isArchived": true, "key": "Z6200_EMO" },
  "Demo 2": { "value": "Demo 2", "isArchived": false, "key": "G211_GTH" }
}

With this, you use the value as the lookup key:

const test91 = byValue["Test 91"]
...

Upvotes: 0

norbitrial
norbitrial

Reputation: 15176

I like to use .reduce() which in this case also works. Read from the MDN documentation:

The reduce() method executes a reducer function (that you provide) on each element of the array, resulting in a single output value.

And you can combine it with Object.entries() where the documentation states:

The Object.entries() method returns an array of a given object's own enumerable string-keyed property [key, value] pairs, in the same order as that provided by a for...in loop. (The only important difference is that a for...in loop enumerates properties in the prototype chain as well).

See the working solution what I made:

const data = { D123_EMG: { value: "Test 91", isArchived: true }, D21: { value: "Test 92", isArchived: false }, Z6200_EMO: { value: "Demo 1", isArchived: true }, G211_GTH: { value: "Demo 2", isArchived: false } };
const filterValue = 'Test 91';

const entries = Object.entries(data);
const result = entries.reduce((a, c) => c[1].value === filterValue ? c[0] : a, '');

console.log(result);

I hope this helps!

Upvotes: 0

emeraldsanto
emeraldsanto

Reputation: 4741

You can use filter() in this way:

const values = ["Test 91", "Test 92", "Demo 1", "Demo 2"];

const data = {
    D123_EMG: {
        value: "Test 91", 
        isArchived: true
    },
    D21: {
        value: "Test 92", 
        isArchived: false
    },
    Z6200_EMO: {
        value: "Demo 1", 
        isArchived: true
    },
    G211_GTH: {
        value: "Demo 2", 
        isArchived: false
    }
}

const keysFound = Object.keys(data).filter(key => values.includes(data[key].value));

console.log(keysFound); // ["D123_EMG", "D21", "Z6200_EMO", "G211_GTH"];

Upvotes: 2

Brian Thompson
Brian Thompson

Reputation: 14395

This isn't really related to react. Someone else may have a cleaner solution, but here is one that will work if I understand your question correctly:

let data = {
    D123_EMG: {
        value: "Test 91", 
        isArchived: true
    },
    D21: {
        value: "Test 92", 
        isArchived: false
    },
    Z6200_EMO: {
        value: "Demo 1", 
        isArchived: true
    },
    G211_GTH: {
        value: "Demo 2", 
        isArchived: false
    }
}

let name = '';
Object.entries(data).forEach((v) => {
  // if the object value matches, set the name variable to the key
  if (v[1].value == 'Test 91') {
    name = v[0];
  }
})


console.log(name)

Upvotes: 0

Related Questions