如何使用Node.js / js通过ID查找JSON对象

时间:2019-09-15 16:33:56

标签: javascript node.js json

所以我想通过该对象中的id 1获取该对象:

let users = {
  'users': {
    'user1': {
      'id': '1',
      'name': 'Brandon',
      'DOB': '05/04/2000'
    },
    'user2': {
      'id': '2',
      'name': 'Jefferson',
      'DOB': '05/19/2004'
    }
  }
}

我想让它返回整个'user1'数组并记录下来,有人知道我该怎么做吗?

我到处都是stackoverflow和文档,却找不到解决方法。我可以帮忙吗?

6 个答案:

答案 0 :(得分:1)

有几种方法,这两种方法都可以大致满足您的需求:

let users = {
  'users': {
    'user1': {
      'id': '1',
      'name': 'Brandon',
      'DOB': '05/04/2000'
    },
    'user2': {
      'id': '2',
      'name': 'Jefferson',
      'DOB': '05/19/2004'
    }
  }
}

const findUserById = (id) => {
  const key = Object.keys(users.users).find(user => users.users[user].id === '1')
  return users.users[key]
}

console.log(findUserById('1'))

let users = {
  'users': {
    'user1': {
      'id': '1',
      'name': 'Brandon',
      'DOB': '05/04/2000'
    },
    'user2': {
      'id': '2',
      'name': 'Jefferson',
      'DOB': '05/19/2004'
    }
  }
}

const findUserById = (id) => {
  const [key, user] = Object.entries(users.users).find(([key, user]) => user.id === '1');
  return user;
}

console.log(findUserById('1'))

答案 1 :(得分:0)

一个简单的for循环就可以做到:

let users = {
    'users': {
      'user1': {
        'id': '1',
        'name': 'Brandon',
        'DOB': '05/04/2000'
      },
      'user2': {
        'id': '2',
        'name': 'Jefferson',
        'DOB': '05/19/2004'
      }
    }
  }
let desiredUser = {};
Object.keys(users.users).forEach((oneUser) => {
    if(users.users[oneUser].id === "1")
        desiredUser = users.users[oneUser];
    
});   

console.log(desiredUser);

答案 2 :(得分:0)

您还可以使用reduce来执行此操作...,以及如果要返回“整个”对象,也可以执行以下操作:

let USER_LIST = {
  'users': {
    'user1': {
      'id': '1',
      'name': 'Brandon',
      'DOB': '05/04/2000'
    },
    'user2': {
      'id': '2',
      'name': 'Jefferson',
      'DOB': '05/19/2004'
    }
  }
}

function findUserById(id){
  return Object.entries(USER_LIST.users).reduce((a, [user, userData]) => {
    userData.id == id ? a[user] = userData : '';
    return a;
  }, {});
}

console.log(findUserById(1));

答案 3 :(得分:0)

尽管skovy的答案是正确的,这是您在实际生产环境中应该做的,但我建议您不要在您的情况下立即应用它。

为什么?您的问题表明,您首先需要学习JavaScript程序员应具备的一些基本原理,即:

如何遍历对象的内容

用于迭代对象键的最简单方法是for .. in循环。使用for .. in循环遍历对象的键时,大括号内的代码将对要迭代的对象的每个键执行一次。

let users = {
   "user1": {
       "id": 1
   },
   "user2": {
       "id": 2
   }
}
for (let key in users) {
    console.log(key);
}

上面的代码将打印:

user1
user2

从此开始,应该清楚如何找到我们想要的元素:

let foundUser = null;
for (let key in users) {
    if (users[key].id === 1) {
        foundUser = users[key];
        break;
    }
}
// now found user is our user with id === 1 or null, if there was no such user

什么时候不做

如果您有一个复杂的对象,它是另一个对象的后代,并且不想遍历继承的属性,则可以改用Object.keys获取当前对象的键数组:

let users = {
   "user1": {
       "id": 1
   },
   "user2": {
       "id": 2
   }
}
const keys = Object.keys(users) // now this is an array containing just keys ['user1', 'user2'];
let foundUser = null;
// now you can iterate over the `keys` array using any method you like, e.g. normal for:
for (let i = 0; i < keys.length; i++) {
    if (users[keys[i]].id === 1) {
        foundUser = users[keys[i]];
        break;
    }
}
// or alternatively `for of`:
for (for key of keys) {
    if (users[key].id === 1) {
        foundUser = users[key];
        break;
    }
}

其他选项

您可以使用Object.values来获取包含对象所有值的数组:

let users = {
   "user1": {
       "id": 1
   },
   "user2": {
       "id": 2
   }
}
const values = Object.values(users); // values: [{"id":1},{"id":2}]

您现在可以自己找到所需的条目:

let foundUser = null
for (let i = 0; i < values.length; i++) {
    if (values[i].id === 1) {
        foundUser = values[i];
        break;
    }
}

或使用数组的find method

let foundUser = values.find(user => user.id === 1);
// now foundUser contains the user with id === 1

或者,较短且完整的版本:

let users = {
   "user1": {
       "id": 1
   },
   "user2": {
       "id": 2
   }
}
const foundUser = Object.values(users).find(user => user.id === 1);
// now foundUser is `{ id: 1 }`

答案 4 :(得分:0)

我同意答案。短而简单的方法就是使用.find()方法

 //--data returned-----//
 data = [{"Id":22,"Title":"Developer"},{"Id":45,"Title":"Admin"}]


      fs.readFile('db.json','utf8', function(err,data){
            var obj = JSON.parse(data);
            console.log(obj);
            var foundItem = obj.find(o=>o.Id==id);
            console.log(foundItem);
       });

答案 5 :(得分:0)

不大喜欢重新发明轮子。现在,我们将object-scan用于大多数数据处理。当您仅可以使用工具处理此类问题时,它非常方便。只需花一点时间就可以使用它。这是它如何回答您的问题:

const objectScan = require('object-scan');

const find = (id, data) => objectScan(['**.id'], {
  abort: true,
  rtn: 'parent',
  filterFn: ({ value }) => value === id
})(data);

const users = {
  users: {
    user1: {
      id: '1',
      name: 'Brandon',
      DOB: '05/04/2000'
    },
    user2: {
      id: '2',
      name: 'Jefferson',
      DOB: '05/19/2004'
    }
  }
};

console.log(find('1', users));
// => { id: '1', name: 'Brandon', DOB: '05/04/2000' }