You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤包含未知键的嵌套对象?基于CUPS API打印机数据的数组过滤实现问题

解决CUPS API嵌套对象的过滤问题

嘿,我懂你为啥用Array.filter()没成功了——你拿到的CUPS数据是以打印机名为键的对象,而filter()是数组的专属方法,没法直接作用在对象上。不过别担心,咱们只需要先把对象转换成数组结构,就能轻松实现过滤需求啦!

解决方案步骤

  1. 对象转键值对数组:用Object.entries()方法,它会把原对象的每个键(打印机名)和对应的值(打印机信息)拆成一个数组元素,格式是[打印机名, 打印机信息对象]。
  2. 过滤符合条件的条目:对转换后的数组使用filter(),筛选出printer-state等于3的项。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 14:27:32