【问题标题】:I need to minus one key, of array of objects, from another key of another array of objects我需要从另一个对象数组的另一个键中减去一个对象数组的键
【发布时间】:2022-01-05 19:36:09
【问题描述】:

我有接下来的两个数组:

const firstArray = [{startDate: 5, number: 15}, {startDate: 25, number: 10}, {startDate: 26, number: 10}];
const secondArray= [{startDay: 2, endDay:10, number: 15}, {startDay: 20, endDay:30, number: 20}];

如果 startDate 介于 startDayendDay 之间,我必须减去 firstArray number 和 secondArray number 用结果创建新密钥

因此,我必须将新键放入 firstArray 中,结果为:

const firstArray = [{startDate: 5, number: 15, result: 0}, {startDate: 25, number: 25, result: -10}, {startDate: 26, number: 25, result: 0}];

如果我在同一范围内(在 startDay 和 endDay 之间)有多个 startDate,我必须添加到该范围的最后一个结果

我现在拥有的代码:

firstArray.map(el => ({...el, result: el.number - here's number from the secondArray according to the requirements}))

【问题讨论】:

    标签: javascript arrays object javascript-objects


    【解决方案1】:

    Map 在循环两个数组和改变值时效果不佳。

    只需使用简单的for 循环,检查firstArray[i]secondArray[i] 之间的条件,然后将值添加到firstArray[i].result

    const firstArray = [{startDate: 5, number: 15}, {startDate: 25, number: 20}];
    const secondArray= [{startDay: 2, endDay:10, number: 10}, {startDay: 20, endDay:30, number: 20}];
    
    for (let i = 0; i < Math.min(firstArray.length, secondArray.length); i++)
      if (secondArray[i].startDay < firstArray[i].startDate && firstArray[i].startDate < secondArray[i].endDay)
        firstArray[i].result = firstArray[i].number - secondArray[i].number;
        
    console.log(firstArray);

    【讨论】:

      【解决方案2】:

      当您使用两个或多个数组时,您需要知道您正在使用哪个索引。此外,为了获得最佳性能,请避免使用任何类型的回调函数,而是使用简单的循环:

      const firstArray = [{startDate: 5, number: 15}, {startDate: 25, number: 10}, {startDate: 26, number: 10}];
      const secondArray= [{startDay: 2, endDay:10, number: 15}, {startDay: 20, endDay:30, number: 20}];
      
      for(let i = 0, first, second, result = 0; i < firstArray.length; i++)
      {
        first = firstArray[i];
        second = secondArray[i];
        if (second && first.startDate >= second.startDay && first.startDate <= second.endDay)
          result = first.number - second.number;
        else
          result += first.number;
      
        first.result = result;
      }
      
      console.log(firstArray);

      使用map() 也可以,生成的代码稍微短一些,但速度较慢且非常不必要:

      const firstArray = [{startDate: 5, number: 15}, {startDate: 25, number: 10}, {startDate: 26, number: 10}];
      const secondArray= [{startDay: 2, endDay:10, number: 15}, {startDay: 20, endDay:30, number: 20}];
      
      firstArray.map((first, i) =>
      {
        const second = secondArray[i];
        if (second && first.startDate >= second.startDay && first.startDate <= second.endDay)
          first.result = first.number - second.number;
        else
          first.result = ((firstArray[i-1]||{}).result || 0) + first.number;
      
      });
      
      console.log(firstArray);

      【讨论】:

      • 能否改进,因为将它与下一个数组一起使用会导致错误 const firstArray = [{startDate: 5, number: 15}, {startDate: 25, number: 20}, {startDate: 26,数量:10}]; const secondArray= [{startDay: 2, endDay:10, number: 10}, {startDay: 20, endDay:30, number: 20}];
      • 我已经更新了代码。我们只能按照您在原始问题中提供的规则进行。您没有提到数组的长度可能不同。
      • firstArray的最后一个对象没有结果
      • 正如我所说,您没有提供任何规则,因此我不知道预期的结果是什么。您的原始规则状态:“如果 firstArray 的 startDate 介于...之间。”好吧,最后一项不符合该条件,因为没有什么可以再次比较它。无论如何,您已经掌握了基础知识,也许您应该自己弄清楚任何其他条件......
      • const firstArray = [{startDate: 5, number: 15, result: 0}, {startDate: 25, number: 10, result: -10}, {startDate: 26, number: 10,结果:0}]; const secondArray= [{startDay: 2, endDay:10, number: 15}, {startDay: 20, endDay:30, number: 20}];这是结果。就像 firstArray 中的所有对象都必须加上它的编号,如果它们来自相同的日期范围()在 startDay 和 endDay 之间
      猜你喜欢
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 1970-01-01
      • 2013-02-21
      • 2015-03-31
      相关资源
      最近更新 更多