[英]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.