按唯一键的最后一个索引过滤数组

问题描述

我有一个on change方法,该方法针对各种用户进行一系列计算,将总计金额分成多个部分,并将其附加到他们的名字上。

    {payment.caseWorkers.map((worker) => (
          <li>
            {worker.name}:{worker.role}{" "}
            <input
              type='text'
              name={worker.name}
              placeHolder='Enter Percent Split'
              onChange={onChange}
            />
          </li>
        ))}

  const onChange = (e) => {

    setSplit([
      ...split,{
        [e.target.name]: 0.01 * payment.paymentAmount * e.target.value * 0.2,},]);
  };

创建

[{mickey gray: 5},{mickey gray: 50},{mickey gray : 500},{steve smith: 5},{steve smith: 50},{steve smith: 500}]

我需要

[{mickey gray: 500},{steve smith: 500}]

根据最后一个索引,以防有人输入过多的零

e.target.name是用户名 e.target.value是他们输入的金额

因此,每次输入新的数组对象时,它们都会创建一次,理想情况下,最后一个条目是该用户的正确编号。

所以我需要创建一个过滤器,以获取每个唯一[e.target.name]的最后一个索引。

我尝试了(a,x,i)x => indexOf(a)=== i的逻辑,我尝试了遍历object.keys的foreach方法,但这些方法都不起作用

解决方法

向后循环可以完成这项工作,将用户名和最后索引存储在单独的字典中。您从右到左循环数组。如果用户尚未在词典中(即,它是它的最后一个条目),则将其添加到词典中;否则它将继续循环。

我建议以这种方式存储每个条目,以使循环更容易:

{ userName: 'mickey gray',value: 500 }

循环可能是这样的:

let indexDictionary = {};
for(let i = array.length - 1; i >= 0; i--) {
  if(!indexDictionary[array[i].userName]) {
    indexDictionary[array[i].userName] = array[i].value;
  }
}
,

嗯,这并不是那么优雅,但是您可以像下面那样做。

var input = [{"mickey gray": 5},{"mickey gray": 50},{"mickey gray" : 500},{"steve smith": 5},{"steve smith": 50},{"steve smith": 500}];

// basically - groupby key
var intermediate = input.reduce( (acc,i) => {
   Object.keys(i).forEach( key => acc.hasOwnProperty(key) ? acc[key].push(i[key]) : acc[key] = [i[key]]);
   return acc;
},{});

// take the key and last item from the values
var result = Object.entries(intermediate).map( entry => {
   var [key,value] = entry;
   return {[key]: value[value.length-1]};
});

console.log(result);