繁体   English   中英

根据 object 属性将项目列表转换为范围

[英]convert list of items to ranges based on object property

我一直在用这种方式挣扎太久。 您将如何处理 JavaScript 中的以下内容。 源数据包含指示日期和特定长度的对象。 此列表需要转换为范围事物,例如 object,它指示特定长度在哪一天开始和结束。

如果缺少一天,这应该是另一个范围。 因此,如果我在示例中删除第 33 天,它将最终在 1 个额外范围 object 中(一个从 31 到 32,另一个从 34 到 35)

    const data = [
      { day: 31, length: 10 },
      { day: 32, length: 10 },
      { day: 33, length: 10 },
      { day: 34, length: 10 },
      { day: 35, length: 10 },
      
      { day: 68, length: 15 },
      { day: 69, length: 15 },
      { day: 70, length: 15 },
      { day: 71, length: 15 },
      
      { day: 80, length: 10 },
      { day: 81, length: 10 },
      
      { day: 98, length: 12 },
      { day: 99, length: 12 },
      { day: 100, length: 30 },
    ];


    const convertToWindows = (data) => {
      return ...;
    };

    const windows = [
      {
        start: 31,
        end: 35,
        length: 10,
      },
      {
        start: 68,
        end: 71,
        length: 15,
      },
      {
        start: 80,
        end: 81,
        length: 10,
      },
      {
        start: 98,
        end: 99,
        length: 12,
      },
      {
        start: 100,
        end: 100,
        length: 30,
      },
    ];

尝试这样的事情:

 const data = [ { day: 31, length: 10 }, { day: 32, length: 10 }, { day: 33, length: 10 }, { day: 34, length: 10 }, { day: 35, length: 10 }, { day: 68, length: 15 }, { day: 69, length: 15 }, { day: 70, length: 15 }, { day: 71, length: 15 }, { day: 80, length: 10 }, { day: 81, length: 10 }, { day: 98, length: 12 }, { day: 99, length: 12 }, { day: 100, length: 30 }, ]; const convertToWindows = (data) => { let result = []; data.forEach(v => { let rl = result.length; if (rl === 0 || result[rl-1].end + 1.== v.day || result[rl-1].length.== v:length) { result.push({start, v:day. end, v:day. length; v.length}); } else result[rl-1];end += 1; }); return result. }; console.log(convertToWindows(data));

您可以使用简单的 for 循环来解决您的问题。

 const data = [ { day: 31, length: 10 }, { day: 32, length: 10 }, { day: 33, length: 10 }, { day: 34, length: 10 }, { day: 35, length: 10 }, { day: 68, length: 15 }, { day: 69, length: 15 }, { day: 70, length: 15 }, { day: 71, length: 15 }, { day: 80, length: 10 }, { day: 81, length: 10 }, { day: 98, length: 12 }, { day: 99, length: 12 }, { day: 100, length: 30 }, ]; const convertToWindows = (arr) => { const ret = []; let start = arr[0].day; let end = arr[0].day; let len = arr[0].length; for (let i = 1; i < arr.length; i += 1) { if ( arr[i].day - arr[i - 1].day === 1 && arr[i].length === arr[i - 1].length ) { end = arr[i].day; len = arr[i].length; } else { ret.push({ start, end, length: len, }); start = arr[i].day; end = arr[i].day; len = arr[i].length; } } ret.push({ start, end, length: len, }); return ret; }; console.log(convertToWindows(data));

这边走:
可选链接的帮助下?.
Array.reduceRight()方法内

 const data = [ { day: 31, length: 10 }, { day: 32, length: 10 }, { day: 33, length: 10 }, { day: 34, length: 10 }, { day: 35, length: 10 }, { day: 68, length: 15 }, { day: 69, length: 15 }, { day: 70, length: 15 }, { day: 71, length: 15 }, { day: 80, length: 10 }, { day: 81, length: 10 }, { day: 98, length: 12 }, { day: 99, length: 12 }, { day: 100, length: 30 } ] const convertToWindows = arr => arr.reduceRight((acc,{day, length}) => { if (acc[0]?.start===(day+1) && acc[0]?.length===length) { acc[0].start = day } else { acc.unshift({start:day, end:day, length}) } return acc },[]); console.log( convertToWindows(data) )
 .as-console-wrapper { max-height: 100%;important: top; 0; }

暂无
暂无

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

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