如何过滤包含未知键的嵌套对象?基于CUPS API打印机数据的数组过滤实现问题
解决CUPS API嵌套对象的过滤问题
嘿,我懂你为啥用Array.filter()没成功了——你拿到的CUPS数据是以打印机名为键的对象,而filter()是数组的专属方法,没法直接作用在对象上。不过别担心,咱们只需要先把对象转换成数组结构,就能轻松实现过滤需求啦!
解决方案步骤
- 对象转键值对数组:用
Object.entries()方法,它会把原对象的每个键(打印机名)和对应的值(打印机信息)拆成一个数组元素,格式是[打印机名, 打印机信息对象]。 - 过滤符合条件的条目:对转换后的数组使用
filter(),筛选出printer-state等于3的项。 - 可选:调整输出格式:如果需要更易读的结构,可以用
map()把结果转换成你想要的格式。
完整代码示例
基础过滤(保留键值对结构)
const data = { 'Expedition': { 'printer-is-shared': false, 'printer-state': 4, 'printer-state-message': '', 'printer-state-reasons': ['none'], }, 'Serverroom': { 'printer-is-shared': false, 'printer-state': 3, 'printer-state-message': '', 'printer-state-reasons': ['none'], } }; // 转换对象为键值对数组 const printerEntries = Object.entries(data); // 过滤状态为3的打印机 const activePrinters = printerEntries.filter(([printerName, printerDetails]) => { return printerDetails['printer-state'] === 3; }); console.log(activePrinters); // 输出:[ ['Serverroom', { printer-is-shared: false, printer-state: 3, ... }] ]
进阶:转换成包含名称的对象数组
如果你希望结果是更直观的对象(每个元素包含打印机名和详细信息),可以再加一步map():
const formattedActivePrinters = activePrinters.map(([name, details]) => ({ name, ...details })); console.log(formattedActivePrinters); // 输出:[ { name: 'Serverroom', printer-is-shared: false, printer-state: 3, ... } ]
只提取打印机名称
如果只需要符合条件的打印机名称数组:
const activePrinterNames = activePrinters.map(([name]) => name); console.log(activePrinterNames); // 输出:['Serverroom']
关键说明
Object.entries()是ES2017引入的方法,它完美解决了对象转数组的问题——之前你直接用Array.filter()失败,就是因为原数据不是数组类型。只要先把对象转换成可迭代的数组结构,数组的各种方法(filter()、map()等)就都能用啦!
内容的提问来源于stack exchange,提问作者Tom van den Broek
相关产品推荐
相关产品推荐

