vkr*_*vkr 4 javascript node.js
我是 Node.js 的新手,有点被困在这里。我有一个类似于此的 json 文件 keyValue.json
[ {
"key": "key1",
"value": "value1"
},
{
"key": "key2",
"value": "value2"
}
]
Run Code Online (Sandbox Code Playgroud)
对于特定的键,我需要获取其值。
function filterValue() {
const category = {};
category.filter = "key1" //this is not static value. This changes dynamically
category.value = //Need to read the keyValue.json file and pick the value for key1 - which is value1
return category;
}
Run Code Online (Sandbox Code Playgroud)
在node.js 中如何实现这一点?感谢您的帮助。
Vic*_*nch 10
我假设您已将 json 解析为变量。所以我的例子将使用这个:
const data = [
{
key: "key1",
value: "value1"
},
{
key: "key2",
value: "value2"
}
];
Run Code Online (Sandbox Code Playgroud)
如果没有,那么在node中我们只要require它就可以了,只要它是静态文件。但这将在应用程序的执行范围内加载一次。
const data = require('./file.json');
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因它正在发生变化而需要动态读取,那么您需要使用 fs (始终在节点中异步执行)。
const fs = require('fs');
fs.readFile('./file.json', 'utf8', function(err, contents) {
if (err) {
// we have a problem because the Error object was returned
} else {
const data = JSON.parse(contents);
... use the data object here ...
}
});
Run Code Online (Sandbox Code Playgroud)
如果您更喜欢 Promise 而不是回调:
const fs = require('fs');
// ES7 Version
const getJsonFile = (filePath, encoding = 'utf8') => (
new Promise((resolve, reject) => {
fs.readFile(filePath, encoding, (err, contents) => {
if(err) {
return reject(err);
}
resolve(contents);
});
})
.then(JSON.parse)
);
// ES6 Version
const getJsonFile = function getJsonFile(filePath, encoding = 'utf8') {
return new Promise(function getJsonFileImpl(resolve, reject) {
fs.readFile(filePath, encoding, function readFileCallback(err, contents) {
if(err) {
return reject(err);
}
resolve(contents);
});
})
.then(JSON.parse);
};
Run Code Online (Sandbox Code Playgroud)
现在,使用其中任何一个,您都可以简单地使用 Promise
getJsonFile('./file.json').then(function (data) { ... do work });
Run Code Online (Sandbox Code Playgroud)
或者如果使用异步
const data = await getJsonFile('./file.json');
Run Code Online (Sandbox Code Playgroud)
所以现在我们想要一个可组合的过滤器与 Array 的 find 方法一起使用。在最新版本的 Node(Carbon 及更高版本)中:
const keyFilter = (key) => (item) => (item.key === key);
Run Code Online (Sandbox Code Playgroud)
如果您是节点 6 或更低,请按照旧方式执行此操作
const keyFilter = function keyFilter(key) {
return function keyFilterMethod(item) {
return item.key === key;
}
};
Run Code Online (Sandbox Code Playgroud)
现在我们可以在数组上使用这个过滤器,随时更改我们正在寻找的键(因为它是可组合的)。
const requestedItem = data.find(keyFilter('key2');
Run Code Online (Sandbox Code Playgroud)
如果键不存在,则返回 undefined,否则,我们就有了该对象。
const requestedValue = requestedItem ? requestedItem.value : null;
Run Code Online (Sandbox Code Playgroud)
该过滤器还可以用于数组中的其他搜索,例如查找索引
const index = data.findIndex(keyFilter('key2'));
Run Code Online (Sandbox Code Playgroud)
如果允许“key”在数组中重复,您可以使用过滤器抓取它们
const items = data.filter(keyFilter('key2'));
Run Code Online (Sandbox Code Playgroud)
总而言之,我们可能会将我们关注的领域放在不同的文件中。所以也许是 getJsonFile.js 和 keyFilter.js 所以现在放在一起我们看起来像这样(调用这个文件 readKeyFromFile):
const getJsonFile = require('./getJsonFile');
const keyFilter = require('./keyFilter');
module.exports = async (filePath, keyName) => {
const json = await getJsonFile(filePath);
const item = json.find(keyFilter(keyName));
return item ? item.value : undefined;
};
Run Code Online (Sandbox Code Playgroud)
和我们的消费者
const readKeyFromFile = require('./readKeyFromFile');
readKeyFromFile('./file.json', 'key2').then((value) => {
console.log(value);
};
Run Code Online (Sandbox Code Playgroud)
一旦理解了这些基础知识,你就可以通过多种组合来做到这一点。所以和他们一起玩吧。:)
| 归档时间: |
|
| 查看次数: |
9638 次 |
| 最近记录: |