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

我有一个更改方法,它为不同的用户进行一系列计算,将总金额分成部分并将其附加到他们的名字上。


    {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 逻辑,我试过在 foreach 中循环遍历 object.keys 这些方法都不起作用


慕运维8079593
浏览 109回答 2
2回答

天涯尽头无女友

好吧,它并不是那么优雅,但你可以像下面那样做。var input = [{"mickey gray": 5}, {"mickey gray": 50}, {"mickey gray" : 500}, {"steve smith": 5}, {"steve smith": 50}, {"steve smith": 500}];// basically - groupby keyvar intermediate = input.reduce( (acc,i) => {&nbsp; &nbsp;Object.keys(i).forEach( key => acc.hasOwnProperty(key) ? acc[key].push(i[key]) : acc[key] = [i[key]]);&nbsp; &nbsp;return acc;},{});// take the key and last item from the valuesvar result = Object.entries(intermediate).map( entry => {&nbsp; &nbsp;var [key,value] = entry;&nbsp; &nbsp;return {[key]: value[value.length-1]};});console.log(result);

慕桂英4014372

向后循环可以完成这项工作,将用户名和最后索引存储在单独的字典中。您从右到左循环数组。如果用户不在字典中(即它是它的最后一个条目),则将其添加到字典中;否则它只会继续循环。我建议以这种方式存储每个条目以使循环更容易:{ userName: 'mickey gray',&nbsp; value: 500 }循环可能是这样的:let indexDictionary = {};for(let i = array.length - 1; i >= 0; i--) {&nbsp; if(!indexDictionary[array[i].userName]) {&nbsp; &nbsp; indexDictionary[array[i].userName] = array[i].value;&nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript