【问题标题】:How can construct a new array based on multiple property values?如何根据多个属性值构造一个新数组?
【发布时间】:2022-12-09 10:12:34
【问题描述】:

我家里有 3 个人 ['John', 'Jane', 'Jack'],

我们跟踪谁打开/关闭了门。

logs = [
  { name: "John", status: "opened" },
  { name: "Jane", status: "opened" },
  { name: "Jack", status: "opened" },
  { name: "Jane", status: "closed" },
  { name: "Jack", status: "closed" },
];

如您所见,只有 2 个人['Jane', 'Jack']正确地打开和关闭了门。

以编程方式,我执行了这 3 个步骤来知道约翰是打开门但从未关闭门的人。

let openers = logs.reduce((acc, log) => {
  if (log.status === "opened") {
    acc.push(log.name);
  }
  return acc;
}, []);

console.log(openers);

let closers = logs.reduce((acc, log) => {
  if (log.status === "closed") {
    acc.push(log.name);
  }
  return acc;
}, []);

console.log(closers);

let result = [];
closers.forEach((closer) => {
  if (openers.includes(closer)) {
    result.push(closer);
  }
});

console.log(result);

我试图一次性完成这些reduce(),但我不太确定。

有人可以帮我改进我得到的东西吗

logs = [
  { name: "John", status: "opened" },
  { name: "Jane", status: "opened" },
  { name: "Jack", status: "opened" },
  { name: "Jane", status: "closed" },
  { name: "Jack", status: "closed" },
];

let openers = logs.reduce((acc, log) => {
  if (log.status === "opened") {
    acc.push(log.name);
  }
  return acc;
}, []);

console.log(openers);

let closers = logs.reduce((acc, log) => {
  if (log.status === "closed") {
    acc.push(log.name);
  }
  return acc;
}, []);

console.log(closers);

let result = [];
closers.forEach((closer) => {
  if (openers.includes(closer)) {
    result.push(closer);
  }
});

console.log(result);

?

【问题讨论】:

    标签: javascript ecmascript-6


    【解决方案1】:

    您可以使用单个 .reduce() 来做到这一点,该 .reduce() 按名称跟踪门的状态:

    logs = [
      { name: "John", status: "opened" },
      { name: "Jane", status: "opened" },
      { name: "Jack", status: "opened" },
      { name: "Jane", status: "closed" },
      { name: "Jack", status: "closed" },
    ];
    
    let statuses = logs.reduce((acc, log) => {
      acc[log.name] = (log.status === 'opened');
      return acc;
    }, {});
    console.log(statuses);
    let culprits = Object.keys(statuses).filter(name => statuses[name]);
    console.log(culprits);

    输出:

    {
      "John": true,
      "Jane": false,
      "Jack": false
    }
    [
      "John"
    ]
    

    【讨论】:

      猜你喜欢
      • 2021-10-19
      • 2021-11-10
      • 2014-07-08
      • 2019-08-10
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 2022-10-23
      相关资源
      最近更新 更多