繁体   English   中英

Javascript Object.keys(arr).reduce() 返回最低键

[英]Javascript Object.keys(arr).reduce() return lowest key

我有 3 个不同的测试用例,每个测试用例都传递给下面的 function getEarliest

{}

{ '2022-04-29': 1 }

{ '2022-04-29': 3, '2022-04-30': 2, '2022-04-28': 3, '2022-05-02': 2 }

从每个测试用例中,我想返回具有最小日期和最大值的键:值。 我的问题是在第三个测试用例中,我得到'2022-04-29': 3而不是'2022-04-28': 3

getEarliest = dates => {

    return Object.keys(dates).reduce((prev, curr) => {

        if (dates[curr] > prev.date) {
        
            return {
                val: dates[curr],
                date: curr
            };
        } else {
            return prev;
        }
    }, {
        val: 0,
        date: null
    }); }

预期结果测试用例 1: { val: 0, date: null }

预期结果测试用例 2: { val: 1, date: '2022-04-29' }

预期结果测试用例 3: { val: 3, date: '2022-04-28' }

看起来您只需要按两个参数对 object 进行sort

 const test1 = {}; const test2 = { '2022-04-29': 1 }; const test3 = { '2022-04-29': 3, '2022-04-30': 2, '2022-04-28': 3, '2022-05-02': 2 }; const test4 = { '2022-04-29': 4, '2022-04-28': 4, '2022-04-30': 4, '2022-05-02': 2 }; const getEarliest = (dates) => { const [date, val] = Object.entries(dates).sort(([k1, v1], [k2, v2]) => v2 - v1 || Date.parse(k1) - Date.parse(k2) ).at(0)?? [null, 0]; return { val, date }; }; console.log(getEarliest(test1)); console.log(getEarliest(test2)); console.log(getEarliest(test3)); console.log(getEarliest(test4));
 .as-console-wrapper {max-height: 100%;important: top: 0}

reduce的结果相同:

 const test1 = {}; const test2 = { '2022-04-29': 1 }; const test3 = { '2022-04-29': 3, '2022-04-30': 2, '2022-04-28': 3, '2022-05-02': 2 }; const test4 = { '2022-04-29': 4, '2022-04-28': 4, '2022-04-30': 4, '2022-05-02': 2 }; const getEarliest = (dates) => { const [date, val] = Object.entries(dates).reduce((prev, curr) => (curr[1] - prev[1] || Date.parse(prev[0]) - Date.parse(curr[0])) > 0? curr: prev, [null, 0]); return { val, date }; }; console.log(getEarliest(test1)); console.log(getEarliest(test2)); console.log(getEarliest(test3)); console.log(getEarliest(test4));
 .as-console-wrapper {max-height: 100%;important:top:0 }

在您的代码prev.date值最初是 null。 因此reduce()将始终返回初始 object。

试试这个代码它可以帮助你

 getEarliest = (dates) => {
      if (Object.keys(dates).length > 0) {
        let date = Object.keys(dates).reduce((prev, curr) => {
          if (prev > curr) {
            return curr;
          } else {
            return prev;
          }
        });

        return {
          val: dates[date],
          date: date
        }
      } else {
        return {
          val: 0, date: null
        }
      }
    }

因为你有 2 个排序条件,所以它们必须按一定的顺序排列。 从您的示例中,我假设顺序是:“最大值”->“最小日期”。 然后你的if将变成如下所示:

getEarliest = (dates) => {
  return Object.keys(dates).reduce(
    (prev, curr) => {
      if (dates[curr] > prev.val || (dates[curr] === prev.val && curr < prev.date)) {
        return {
          val: dates[curr],
          date: curr,
        }
      } else {
        return prev
      }
    },
    {
      val: 0,
      date: null,
    }
  )
}
  • 在第一条语句中, .date属性从未被定义,所以它应该是undefined dates是一个数组而不是 object 所以dates[curr]看起来像dates['2022-04-28']没有帮助。 以符号形式 ex。 array[5]一个整数作为索引放在括号中,它是.reduce()的第三个参数

    if (dates[curr] > prev.date) {...
  • 你得到"2022-04-29"的原因是因为数组永远不会改变,你需要使用.sort()一个更简单的方法或.reduce()对新手来说太复杂的方法对日期进行实际排序。

细节在下面的例子中注释

 let A = {}; let B = { '2022-04-29': 1 }; let C = { '2022-04-29': 3, '2022-04-30': 2, '2022-04-28': 3, '2022-05-02': 2 }; // Optional utility function const log = data => console.log(JSON.stringify(data)); /* Can convert from timestamp to YYYY-MM-DD and vice versa */ const dX = (number, string) => { let D; if (number) { let date = new Date(number); D = ` ${date.getFullYear()}-${("0" + (date.getMonth() + 1)).slice(-2)}-${("0" + date.getDate()).slice(-2)}`; } else if (string) { D = Date.parse(string); } else { return false; } return D; }; // Pass tS = {...} const getEarliest = tS => { // if tS is empty... if (Object.keys(tS).length === 0) { // Return premade object return { val: 0, date: null }; } /* Object.entries(tS) converts {k: v, k: v,...} into [[k,v], [k,v]...] */ /*.map(([k, v]) exposes key/value pairs by destructuring [k, v] */ /*.sort(a, b) is referencing each date key and converting it into a number (ms since epoch) */ let table = Object.entries(tS).map(([k, v]) => [k, v]).sort((a, b) => dX(null, a[0]) - dX(null, b[0])); let obj = {}; obj.val = table[0][1]; obj.date = table[0][0]; return obj; }; log(getEarliest(A)); log(getEarliest(B)); log(getEarliest(C));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM