更新属性并从 JavaScript 中删除数组中的重复元素



我对某些代码有问题。这是我的阵列

[
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 1,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 2,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 1,
    numberHoursSpent: 3,
    mail: "sale2@gmail.com",
    id: "5cef5a62b9c3113764e2183b",
    created: 1559190114548,
    updated: 1559190114548
  },
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 4,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 3,
    numberHoursSpent: 5,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  }
  ]

问题是我需要让我的数组看起来像这样。

[
  {
    name: "Sale Network 1",
    numberSoldLodging: 3,
    numberHoursSpent: (1+2+4)/(1+1+1),
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 2,
    numberHoursSpent: (3+5)/(1+3),
    mail: "sale2@gmail.com",
    id: "5cef5a62b9c3113764e2183b",
    created: 1559190114548,
    updated: 1559190114548
  },
  ]
相当于这个

[
  {
    name: "Sale Network 1",
    numberSoldLodging: 3,
    numberHoursSpent: 2.33,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 2,
    numberHoursSpent: 2,
    mail: "sale2@gmail.com",
    id: "5cef5a62b9c3113764e2183b",
    created: 1559190114548,
    updated: 1559190114548
  },
  ]

首先,如果它们具有相同的"名称"属性,我会在数组中找到相同的对象。然后,我对所有 numberHoursSpent 属性求和,并将它们除以这些对象中 numberSoldLodgings(已售住宿(属性的总和。然后我删除所有相同的元素,只保留一个唯一的元素。P/S:如果对象具有相同的"名称"属性,则它们是相同的。这是我尝试过的。

handleData = arr => {
  var firstElementIndex =0;
  const final = []
  var filteredArray = []
  arr.map((e,i)=>{
    if(final.includes(e.name)){
      var k = k+arr[i].numberHoursSpent;
      firstElementIndex = final.indexOf(e.name);
      arr[firstElementIndex].numberHoursSpent +=  arr[i].numberHoursSpent
      filteredArray= arr.filter(item => item !== arr[i] )
    }
    else{
      final.push(e.name)
    }
    if(i == arr.length-1){
      arr[firstElementIndex].numberHoursSpent /= k
    }
  })
  return filteredArray;    
}

请帮助我,谢谢。

reducemap与解构、展开和Object.values一起使用:

const data = [{name:"Sale Network 1",numberSoldLodging:1,numberHoursSpent:1,mail:"lanlehoang10@gmail.com",id:"5ceb9b5aff2d5732b4282886",created:1558944602810,updated:1558944602810},{name:"Sale Network 1",numberSoldLodging:1,numberHoursSpent:2,mail:"lanlehoang10@gmail.com",id:"5ceb9b5aff2d5732b4282886",created:1558944602810,updated:1558944602810},{name:"Sale Network 2",numberSoldLodging:1,numberHoursSpent:3,mail:"sale2@gmail.com",id:"5cef5a62b9c3113764e2183b",created:1559190114548,updated:1559190114548},{name:"Sale Network 1",numberSoldLodging:1,numberHoursSpent:4,mail:"lanlehoang10@gmail.com",id:"5ceb9b5aff2d5732b4282886",created:1558944602810,updated:1558944602810},{name:"Sale Network 2",numberSoldLodging:3,numberHoursSpent:5,mail:"lanlehoang10@gmail.com",id:"5ceb9b5aff2d5732b4282886",created:1558944602810,updated:1558944602810}];
const res = Object.values(data.reduce((acc, { name, numberSoldLodging, numberHoursSpent, ...rest }) => {
  acc[name] = acc[name] || { name, numberSoldLodging: 0, numberHoursSpent: 0, ...rest };
  acc[name].numberSoldLodging += numberSoldLodging;
  acc[name].numberHoursSpent += numberHoursSpent;
  return acc;
}, {})).map(({ numberSoldLodging, numberHoursSpent, ...rest }) => ({ numberSoldLodging, numberHoursSpent: numberHoursSpent / numberSoldLodging, ...rest }));
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }

请注意,reduce函数中的第一行执行重复工作,因此您不需要在末尾进行额外的filter调用。

function foo(arr) {
  let dict = {}
  arr.forEach(x => {
    if (dict[x.name]) {
      let y = dict[x.name]
      dict[x.name]['numberHoursSpent'] = y['numberHoursSpent'] + x['numberHoursSpent']
      dict[x.name]['numberSoldLodging'] = y['numberSoldLodging'] + x['numberSoldLodging']
    } else {
      dict[x.name] = x
    }
  })
  return Object.keys(dict).map(x => {
    dict[x]['numberHoursSpent'] = dict[x]['numberHoursSpent'] / dict[x]['numberSoldLodging']
    return dict[x]
  })
  // return dict
}
let arr = [{
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 1,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 2,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 1,
    numberHoursSpent: 3,
    mail: "sale2@gmail.com",
    id: "5cef5a62b9c3113764e2183b",
    created: 1559190114548,
    updated: 1559190114548
  },
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 4,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 3,
    numberHoursSpent: 5,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  }
]
let y = foo(arr)
console.log(y)

你可以尝试如下:

let array = [{
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 1,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 2,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 1,
    numberHoursSpent: 3,
    mail: "sale2@gmail.com",
    id: "5cef5a62b9c3113764e2183b",
    created: 1559190114548,
    updated: 1559190114548
  },
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 4,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 3,
    numberHoursSpent: 5,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  }
];
function filteredArray(array){
  let filteredArr = [];
  // Initialize the array
  filteredArr.push(array[0]);
  
  // Filtered the array
  for(let i=1; i<array.length; i++){
    let elementFound = false;
    
    for(let j=0; j<filteredArr.length; j++){
      if(array[i].name === filteredArr[j].name){ 
        elementFound = true;
        filteredArr[j].numberSoldLodging += array[i].numberSoldLodging;
        filteredArr[j].numberHoursSpent += array[i].numberHoursSpent;
      }
    }
    
    if(!elementFound)
      filteredArr.push(array[i]);
  }
  
  // Modified the 'numberHoursSpent'
  filteredArr.forEach(el => {
      el.numberHoursSpent /= el.numberSoldLodging;
      el.numberHoursSpent = parseFloat(el.numberHoursSpent.toFixed(2));
      });
  
  // Note : I have added toFixed for above long float integer '2.33333333333333333'
  
  return filteredArr;
}
console.log(filteredArray(array));

试试这个:

const qq = [
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 1,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 2,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 1,
    numberHoursSpent: 3,
    mail: "sale2@gmail.com",
    id: "5cef5a62b9c3113764e2183b",
    created: 1559190114548,
    updated: 1559190114548
  },
  {
    name: "Sale Network 1",
    numberSoldLodging: 1,
    numberHoursSpent: 4,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  },
  {
    name: "Sale Network 2",
    numberSoldLodging: 3,
    numberHoursSpent: 5,
    mail: "lanlehoang10@gmail.com",
    id: "5ceb9b5aff2d5732b4282886",
    created: 1558944602810,
    updated: 1558944602810
  }
  ];
  
  let p = new Map();
  for (let q of qq) {
    let s = p.get(q.name)
    if(s) {
      s.numberSoldLodging += q.numberSoldLodging;
      s.numberHoursSpent += q.numberHoursSpent;
      p.set(q.name, s);
    } else {
      p.set(q.name, q);
    }
    
  }
  
  
const result = [];
p.forEach((val, key, map) => {
  val.numberHoursSpent = val.numberHoursSpent / val.numberSoldLodging;
  result.push(val)
});
console.log(result);

最新更新