Widzę, że to pytanie było często poruszane w przypadku przepełnienia stosu, ale nie mogę znaleźć takiego, które pomoże w moim problemie. Mam obiekt, który zawiera wiele tablic z obiektami zagnieżdżonymi w środku. Musze znaleźć ...

1
CourtneyJ 23 czerwiec 2021, 23:13

4 odpowiedzi

Najlepsza odpowiedź

Wystarczyłoby proste filter() wewnątrz pętli for...in. Po zapoznaniu się z innymi odpowiedziami powinienem powiedzieć, że zwróci to pierwszy pasujący identyfikator, a nie tablicę wszystkich pasujących identyfikatorów, jak odpowiedź @Barmars

const practices = {
  FL: [{id: "mp-2d24973e-c610-4b1c-9152"},{id:"3"}],
  TX: [{id: "mp-2d24973e-c610-4b1c-9153"},{id:"4"}],
  LA: [{id: "mp-2d24973e-c610-4b1c-9154"},{id:"5"}],
}

const findUserKey = (u) => {
  for (const key in practices) {
    if (practices[key].filter(mp => mp.id === u.currentPracticeID).length>0) return key
  }
  return false;
}

let currentUser = {currentPracticeID: "mp-2d24973e-c610-4b1c-9154"}
let check_mp = findUserKey(currentUser)
console.log(check_mp)
1
Kinglish 23 czerwiec 2021, 20:39

Możesz użyć Object#keys aby uzyskać listę kluczy obiektów, Array#find, aby przejść przez tę listę i Array#findIndex, aby sprawdzić, czy tablica w każdej iteracji zawiera userId, którego szukasz:

const getKeyOfUserId = (obj = {}, userId) => 
  Object.keys(obj).find(key =>
    obj[key].findIndex(({ id }) => id === userId) >= 0
  );
  
const obj = {
  FL: [{id: "mp-2d24973e-c610-4b1c-9152"},{id:"mp-2d24973e-c610-4b1c-9153"}],
  TX: [{id: "mp-2d24973e-c610-4b1c-9154"},{id:"mp-2d24973e-c610-4b1c-9155"}],
  LA: [{id: "mp-2d24973e-c610-4b1c-9156"},{id:"mp-2d24973e-c610-4b1c-9157"}]
};
console.log( getKeyOfUserId(obj, "mp-2d24973e-c610-4b1c-9156") );
1
Majed Badawi 23 czerwiec 2021, 20:21

filter() to metoda tablicowa, practices to obiekt. Musisz użyć Object.entries(), aby uzyskać tablicę kluczy i wartości.

Następnie możesz użyć .some(), aby sprawdzić, czy którykolwiek z obiektów w zagnieżdżonej tablicy zawiera identyfikator, którego szukasz.

const practices = {
  FL: [{
    id: "mp-2d24973e-c610-4b1c-9152"
  }, {
    id: "mp-2d24973e-c610-4b1c-9153"
  }],
  TX: [{
    id: "mp-2d24973e-c610-4b1c-9154"
  }, {
    id: "mp-2d24973e-c610-4b1c-9155"
  }],
  LA: [{
    id: "mp-2d24973e-c610-4b1c-9156"
  }, {
    id: "mp-2d24973e-c610-4b1c-9157"
  }]
};

let currentPracticeID = "mp-2d24973e-c610-4b1c-9156";
const states = Object.entries(practices).filter(([key, arr]) => arr.some(({
  id
}) => id == currentPracticeID)).map(([key, arr]) => key);

console.log(states);
1
Barmar 23 czerwiec 2021, 20:26

Oto jak to zrobił:

const data = {
    FL: [{id: 'ab'}, {id: 'cd'}, {id: 'ef'}],
    TX: [{id: 'hi'}, {id: 'jk'}, {id: 'lm'}],
    LA: [{id: 'no'}, {id: 'pq'}, {id: 'rs'}]
};

const findKey = (id) => {
    let foundKey;
    Object.entries(data).some(([key, objects]) => {
        if (objects.find(object => object.id === id)) {
            foundKey = key;
            return true;
        }            
    });

    return foundKey;
};

console.log(`The data: ${JSON.stringify(data)}`);
console.log(`Looking for object with ID "jk": ${findKey('jk')}`);

Przechodzisz przez wpisy Twoje dane, więc masz klucz i obiekty dla tego klucza. Wystarczy użyć objects.find aby zobaczyć, który obiekt pasuje do szukanego identyfikatora. Używałbym array.some w tym celu, ponieważ zatrzymuje pętlę po zwróceniu true, a foundKey będzie po prostu fałszywy, jeśli nic nie zostanie znalezione.

0
dev 23 czerwiec 2021, 20:27