【问题标题】:How to calculate and create new object value from two different arrays in Javascript如何在Javascript中从两个不同的数组计算和创建新的对象值
【发布时间】:2021-08-03 09:53:09
【问题描述】:
var array1 = [{issueCount: 16, failCount: 38, id: 1},
{issueCount: 15, failCount: 37, id: 2},
{issueCount: 15, failCount: 34, id: 3}];

var array2 = [{id: 1, totalAttempts: 57},
{id: 2, totalAttempts: 59},
{id: 3, totalAttempts: 67},
{id: 4, totalAttempts: 59}];

我有两个数组。从上面的数组中,我需要使用 (array1.fail count/array2.totalAttempts) * 100 [id is common between two arrays]来计算失败百分比。最终的数组需要以下格式。

outputArray = [{id: 1, issueCount: 16, failCount: 38, percentage: 66.66},
{id: 2, issueCount: 15, failCount: 37, percentage: 62.71},
{id: 3, issueCount: 15, failCount: 34, percentage: 50.74}];

提前致谢。

【问题讨论】:

  • outputArray = []; array1.forEach(function(dataItem1, idx) { var array2Items = array2[idx]; var outputItems = {}; if(dataItem1.id == array2Items.id){ outputItems.id = dataItem1.id; outputItems.issueCount = dataItem1 .issueCount; outputItems.failCount = dataItem1.failCount; outputItems.percentage = (dataItem1.failCount/array2Items.totalAttempts)*100; outputArray.push(outputItems); } });
  • 当我的array1 长度和array2 长度相同并且array2 长度> array1 长度时,上面的代码工作正常。但是,当我的数组 1 长度 > 数组 2 长度时,它不起作用。我需要添加什么代码改进才能实现所有场景。提前致谢。
  • 您真的应该参观一下以了解该网站的运作方式。即使使用不同的数组长度,提供的两种解决方案都可以解决您的问题。如果您只是对自己的答案写评论,没人会看到它

标签: javascript arrays javascript-objects


【解决方案1】:

您可以通过一个简单的 for 循环来实现这一点。

只需检查 id 是否存在于第二个数组中,如果存在则进行计算。

const array1 = [{issueCount: 16, failCount: 38, id: 1},
{issueCount: 15, failCount: 37, id: 2},
{issueCount: 15, failCount: 34, id: 3}];

const array2 = [{id: 1, totalAttempts: 57},
{id: 2, totalAttempts: 59},
{id: 3, totalAttempts: 67},
{id: 4, totalAttempts: 59}];

const outputArray = [];

array1.forEach(i1 => {
  const i2 = array2.find(i => i.id === i1.id);
  if(i2) {
    outputArray.push({
      id: i1.id, 
      issueCount: i1.issueCount, 
      failCount: i1.failCount,
      percentage: (i1.failCount / i2.totalAttempts) * 100
      }); 
  }
});
console.log(outputArray)

【讨论】:

    【解决方案2】:

    你可以这样做:

    const array1 = [{issueCount: 16, failCount: 38, id: 1},{issueCount: 15, failCount: 37, id: 2},{issueCount: 15, failCount: 34, id: 3}]
    const array2 = [{id: 1, totalAttempts: 57},{id: 2, totalAttempts: 59},{id: 3, totalAttempts: 67},{id: 4, totalAttempts: 59}]
    
    const mergedArrays = Object.values([...array1, ...array2].reduce((a, c) => (a[c.id] = { ...a[c.id], ...c }, a), {}))
    const outputArray = mergedArrays
      .filter(o => o.issueCount && o.totalAttempts)
      .map(({ id, issueCount, failCount, percentage, totalAttempts }) => ({
        id, 
        issueCount, 
        failCount,
        percentage: Math.round(failCount / totalAttempts * 100 * 100) / 100
      }))
      
    console.log(outputArray)

    【讨论】:

      【解决方案3】:

      感谢大家的帖子。我也找到了下面的解决方案。

      outputArray = []; 
          array1.forEach(function(dataItem1, idx) { 
              var array2Items = array2[idx]; 
              var outputItems = {}; 
              if (dataItem1 && array2Items){
              if(dataItem1.id == array2Items.id){ 
                  outputItems.id = dataItem1.id; 
                  outputItems.issueCount = dataItem1.issueCount; 
                  outputItems.failCount = dataItem1.failCount; 
                  outputItems.percentage = ((dataItem1.failCount/array2Items.totalAttempts)*100).toFixed(2); 
                  outputArray.push(outputItems); 
              } 
              }
          });
          
          console.log(outputArray);
      

      【讨论】:

      • 此方法适用于您的测试数据,但容易出错。
      • 嗨,凯文,我同意。实时场景与这篇文章不同。在原始代码中,我使用 find() 和其他公司特定的专有工具。因此,它使我们不容易出错。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2021-09-24
      • 2022-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多