最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How to check if an object key is in another object of objects - Stack Overflow

programmeradmin0浏览0评论

I have the following objects:

const allMembers = {
    "-Lz8YxHiwp8QZW3TqAFn": {
        "first": "foo",
        "last": "bar",
        "uid": "-Lz8YxHiwp8QZW3TqAFn"
    },
    "-Lz8YxHqQXWoaGOFRLrO": {
        "first": "foo",
        "last": "bar",
        "uid": "-Lz8YxHqQXWoaGOFRLrO"
    },
    "-Lz8YxHsMItaaTVNyQRE": {
        "first": "foo",
        "last": "bar",
        "uid": "-Lz8YxHsMItaaTVNyQRE"
    },
    "-Lz8YxHwuVBMWl0Go6C5": {
        "first": "foo",
        "last": "bar",
        "uid": "-Lz8YxHwuVBMWl0Go6C5"
    },
    "-Lz8YxHy0S-QkDaE1PkX": {
        "first": "foo",
        "last": "bar",
        "uid": "-Lz8YxHy0S-QkDaE1PkX"
    },
}

const attendanceData = {
    "-Lz8YxHiwp8QZW3TqAFn": true,
    "-Lz8YxHqQXWoaGOFRLrO": true,
    "-Lz8YxHsMItaaTVNyQRE": true,
    "-Lz8YxHwuVBMWl0Go6C5": false,
    "-Lz8YxHy0S-QkDaE1PkX": true,
    "-Lz8YxIFA1XGVmaNfNr3": false,
    "-Lz8YxIJVZnIIj7RgEzg": false,
}

I need to clean up the allMembers to only return if it's found as true in attendanceData. Here is my attempt but it's obviously not working. Also the way I'm doing it has to loop the first one over the other times.

const membersHere = Object.keys(allMembers).filter(memEl => Object.keys(attendanceData).find(attendEl => memEl == attendEl));

I have the following objects:

const allMembers = {
    "-Lz8YxHiwp8QZW3TqAFn": {
        "first": "foo",
        "last": "bar",
        "uid": "-Lz8YxHiwp8QZW3TqAFn"
    },
    "-Lz8YxHqQXWoaGOFRLrO": {
        "first": "foo",
        "last": "bar",
        "uid": "-Lz8YxHqQXWoaGOFRLrO"
    },
    "-Lz8YxHsMItaaTVNyQRE": {
        "first": "foo",
        "last": "bar",
        "uid": "-Lz8YxHsMItaaTVNyQRE"
    },
    "-Lz8YxHwuVBMWl0Go6C5": {
        "first": "foo",
        "last": "bar",
        "uid": "-Lz8YxHwuVBMWl0Go6C5"
    },
    "-Lz8YxHy0S-QkDaE1PkX": {
        "first": "foo",
        "last": "bar",
        "uid": "-Lz8YxHy0S-QkDaE1PkX"
    },
}

const attendanceData = {
    "-Lz8YxHiwp8QZW3TqAFn": true,
    "-Lz8YxHqQXWoaGOFRLrO": true,
    "-Lz8YxHsMItaaTVNyQRE": true,
    "-Lz8YxHwuVBMWl0Go6C5": false,
    "-Lz8YxHy0S-QkDaE1PkX": true,
    "-Lz8YxIFA1XGVmaNfNr3": false,
    "-Lz8YxIJVZnIIj7RgEzg": false,
}

I need to clean up the allMembers to only return if it's found as true in attendanceData. Here is my attempt but it's obviously not working. Also the way I'm doing it has to loop the first one over the other times.

const membersHere = Object.keys(allMembers).filter(memEl => Object.keys(attendanceData).find(attendEl => memEl == attendEl));
Share Improve this question asked May 26, 2022 at 19:33 FabricioGFabricioG 3,3406 gold badges43 silver badges95 bronze badges 1
  • What result do you actually want? If it's just the list of IDs then: Object.keys(allMembers).filter(m => attendanceData[m]) – jarmod Commented May 26, 2022 at 19:39
Add a ment  | 

3 Answers 3

Reset to default 4
  • Convert the allMembers object into an array of key value pairs using Object.entries.

  • Filter the items that have value true using Array.prototype.filter.

  • Transform the array back to an object using Object.fromEntries.

const 
  allMembers = {'-Lz8YxHiwp8QZW3TqAFn': {first: 'foo',last: 'bar',uid: '-Lz8YxHiwp8QZW3TqAFn'},'-Lz8YxHqQXWoaGOFRLrO': {first: 'foo',last: 'bar',uid: '-Lz8YxHqQXWoaGOFRLrO'},'-Lz8YxHsMItaaTVNyQRE': {first: 'foo',last: 'bar',uid: '-Lz8YxHsMItaaTVNyQRE'},'-Lz8YxHwuVBMWl0Go6C5': {first: 'foo',last: 'bar',uid: '-Lz8YxHwuVBMWl0Go6C5'},'-Lz8YxHy0S-QkDaE1PkX': {first: 'foo',last: 'bar',uid: '-Lz8YxHy0S-QkDaE1PkX'}},
  attendanceData = {'-Lz8YxHiwp8QZW3TqAFn': true,'-Lz8YxHqQXWoaGOFRLrO': true,'-Lz8YxHsMItaaTVNyQRE': true,'-Lz8YxHwuVBMWl0Go6C5': false,'-Lz8YxHy0S-QkDaE1PkX': true,'-Lz8YxIFA1XGVmaNfNr3': false,'-Lz8YxIJVZnIIj7RgEzg': false},
  filteredMembers = Object.fromEntries(
    Object.entries(allMembers).filter(([k]) => attendanceData[k])
  );

console.log(filteredMembers);

You can also do it using Array.prototype.reduce

const 
  allMembers = {'-Lz8YxHiwp8QZW3TqAFn': {first: 'foo',last: 'bar',uid: '-Lz8YxHiwp8QZW3TqAFn'},'-Lz8YxHqQXWoaGOFRLrO': {first: 'foo',last: 'bar',uid: '-Lz8YxHqQXWoaGOFRLrO'},'-Lz8YxHsMItaaTVNyQRE': {first: 'foo',last: 'bar',uid: '-Lz8YxHsMItaaTVNyQRE'},'-Lz8YxHwuVBMWl0Go6C5': {first: 'foo',last: 'bar',uid: '-Lz8YxHwuVBMWl0Go6C5'},'-Lz8YxHy0S-QkDaE1PkX': {first: 'foo',last: 'bar',uid: '-Lz8YxHy0S-QkDaE1PkX'}},
  attendanceData = {'-Lz8YxHiwp8QZW3TqAFn': true,'-Lz8YxHqQXWoaGOFRLrO': true,'-Lz8YxHsMItaaTVNyQRE': true,'-Lz8YxHwuVBMWl0Go6C5': false,'-Lz8YxHy0S-QkDaE1PkX': true,'-Lz8YxIFA1XGVmaNfNr3': false,'-Lz8YxIJVZnIIj7RgEzg': false},
  filteredMembers = Object.entries(allMembers).reduce(
    (r, [k, v]) => (attendanceData[k] && (r[k] = v), r),
    {}
  );

console.log(filteredMembers);

Other relevant documentations:

  • Comma operator (,)

You can use reduce method:

const allMembers = {
    "-Lz8YxHiwp8QZW3TqAFn": {
        "first": "foo",
        "last": "bar",
        "uid": "-Lz8YxHiwp8QZW3TqAFn"
    },
    "-Lz8YxHqQXWoaGOFRLrO": {
        "first": "foo",
        "last": "bar",
        "uid": "-Lz8YxHqQXWoaGOFRLrO"
    },
    "-Lz8YxHsMItaaTVNyQRE": {
        "first": "foo",
        "last": "bar",
        "uid": "-Lz8YxHsMItaaTVNyQRE"
    },
    "-Lz8YxHwuVBMWl0Go6C5": {
        "first": "foo",
        "last": "bar",
        "uid": "-Lz8YxHwuVBMWl0Go6C5"
    },
    "-Lz8YxHy0S-QkDaE1PkX": {
        "first": "foo",
        "last": "bar",
        "uid": "-Lz8YxHy0S-QkDaE1PkX"
    },
}

const attendanceData = {
    "-Lz8YxHiwp8QZW3TqAFn": true,
    "-Lz8YxHqQXWoaGOFRLrO": true,
    "-Lz8YxHsMItaaTVNyQRE": true,
    "-Lz8YxHwuVBMWl0Go6C5": false,
    "-Lz8YxHy0S-QkDaE1PkX": true,
    "-Lz8YxIFA1XGVmaNfNr3": false,
    "-Lz8YxIJVZnIIj7RgEzg": false,
}

const reduced = Object.entries(allMembers).reduce((data, [key, value]) => {
  if (attendanceData[key] ?? false)
    data[key] = value;
  return data;  
}, {});

console.log(reduced);

You can bine Object.keys(), Array.prototype.filter() and Array.prototype.reduce()

Code:

const allMembers = {'-Lz8YxHiwp8QZW3TqAFn': {first: 'foo',last: 'bar',uid: '-Lz8YxHiwp8QZW3TqAFn',},'-Lz8YxHqQXWoaGOFRLrO': {first: 'foo',last: 'bar',uid: '-Lz8YxHqQXWoaGOFRLrO',},'-Lz8YxHsMItaaTVNyQRE': {first: 'foo',last: 'bar',uid: '-Lz8YxHsMItaaTVNyQRE',},'-Lz8YxHwuVBMWl0Go6C5': {first: 'foo',last: 'bar',uid: '-Lz8YxHwuVBMWl0Go6C5',},'-Lz8YxHy0S-QkDaE1PkX': {first: 'foo',last: 'bar',uid: '-Lz8YxHy0S-QkDaE1PkX',},}

const attendanceData = {'-Lz8YxHiwp8QZW3TqAFn': true,'-Lz8YxHqQXWoaGOFRLrO': true,'-Lz8YxHsMItaaTVNyQRE': true,'-Lz8YxHwuVBMWl0Go6C5': false,'-Lz8YxHy0S-QkDaE1PkX': true,'-Lz8YxIFA1XGVmaNfNr3': false,'-Lz8YxIJVZnIIj7RgEzg': false,}
  
const result = Object
  .keys(allMembers)
  .filter((k) => attendanceData[k])
  .reduce((a, k) => (a[k] = allMembers[k], a), {})

console.log(result)

发布评论

评论列表(0)

  1. 暂无评论