如何解决按唯一键的最后一个索引过滤数组
我有一个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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。