簡體   English   中英

我如何使用 nodejs/js 通過 id 找到一個 json 對象

[英]How could I find a json object by id using nodejs/js

所以我想通過這個對象中的 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和文檔,但找不到辦法做到這一點。 我能得到一些幫助嗎?

有幾種方法,這兩種方法都應該大致實現您正在尋找的內容:

 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'))

雖然 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 方法

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 }`

一個簡單的 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);

您也可以為此使用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));

我同意答案。 只是一個簡短的方法是使用 .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);
       });

不太喜歡重新發明輪子。 我們現在使用對象掃描進行大部分數據處理。 當您可以僅使用工具處理此類事情時,這非常方便。 只需花一點時間來了解如何使用它。 以下是它如何回答您的問題:

 // 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' }
 .as-console-wrapper {max-height: 100% !important; top: 0}
 <script src="https://bundle.run/object-scan@13.8.0"></script>

免責聲明:我是對象掃描的作者

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM