如何使用javascript获取数组中特定id的最后一个值?

如何使用javascript获取数组中特定id的最后一个值?,javascript,jquery,arrays,ajax,Javascript,Jquery,Arrays,Ajax,我有一个函数,用于在数组onkeyup事件中存储行的值。但是,在某些情况下,它将存储相同的行值,但数量和总数不同,但id相同。如何将其存储在数组中,使其仅保存特定id的最新值集?我知道这有点混乱,但请看下图。谢谢你的帮助 我想保存ff: {id:"1", qty:"4", price:"45", total:"180"} {id:"2", qty:"3", price:"10", total:"30"} {id:"3", qty:"50", price:"12", total:"600"} {

我有一个函数,用于在数组onkeyup事件中存储行的值。但是,在某些情况下,它将存储相同的行值,但数量和总数不同,但id相同。如何将其存储在数组中,使其仅保存特定id的最新值集?我知道这有点混乱,但请看下图。谢谢你的帮助

我想保存ff:

{id:"1", qty:"4", price:"45", total:"180"}
{id:"2", qty:"3", price:"10", total:"30"}
{id:"3", qty:"50", price:"12", total:"600"}
{id:"4", qty:"60", price:"12", total:"720"}
我的代码:

var arrayVar = [];
var data;

$(function(){

  $('#tbl-po-list').on( 'keyup change' , 'input[type="number"]' ,function(){

    $(this).parents('.info').find('.total').val($(this).val() * $(this).parents('.info').find('.price').val());

      data = {
        id: $(this).parents('.info').find('.prod-id').val(),
        qty: $(this).val(),
        price: $(this).parents('.info').find('.price').val(),
        total: $(this).parents('.info').find('.total').val()
      }

      arrayVar.push(data); 

      for(var i = 0; i < arrayVar.length; i++){
        console.log(arrayVar[i]);
      }

    });   

  });
var arrayVar=[];
var数据;
$(函数(){
$('tbl po list')。在('keyup change','input[type=“number”]',函数()上{
$(this).parents('.info').find('.total').val($(this.val()*$(this).parents('.info').find('.price').val());
数据={
id:$(this).parents('.info').find('.prod id').val(),
数量:$(this).val(),
价格:$(this).parents('.info').find('.price').val(),
总计:$(this).parents('.info').find('.total').val()
}
arrayVar.push(数据);
对于(变量i=0;i
如果发现数组值,则需要在for循环内部使用
splice()
删除该数组值:

var id = $(this).parents('.info').find('.prod-id').val();

for(var i = 0; i < arrayVar.length; i++){
   if(arrayVar[i]['id'] == id){
       arrayVar.splice(i, 1);
   }
}
var id=$(this).parents('.info').find('.prod id').val();
对于(变量i=0;i

从头到尾迭代,只将新对象(按id)推送到新数组中
unshift
使新数组保持相同的顺序

var index = [], out = [];
for (var i = arr.length - 1; i >= 0; i--) {
  if (index.indexOf(arr[i].id) === -1) {
    index.push(arr[i].id);
    out.unshift(arr[i]);
  }
}

如果您更换:

arrayVar.push(data); 
作者:

for(变量i=0;i
如果循环没有找到相同的id,那么在循环之后,我将等于arrayVar.length,因此赋值将像推一样

另一方面,如果找到id,则循环退出,赋值将替换之前该数组元素中的任何内容

更简洁的版本如下:

for(var i = 0; i < arrayVar.length && arrayVar[i].id !== data.id; i++);
arrayVar[i] = data;
for(var i=0;i
似乎适合打一些代码高尔夫。以下是我的尝试:

o=data.reduce((a,v)=>a[v.id]=v&&a,{});Object.keys(o).map(k=>o[k]);
原始代码:

obj = data.reduce((accum, value, i) => {
  accum[value.id] = value;
  return accum;
})
out = Object.keys(obj).map(key => obj[key]);
其工作原理是使用将值累积到对象中—使用id作为键意味着具有相同id的行将被覆盖—然后从对象中提取值。

您能创建一个小提琴吗?
obj = data.reduce((accum, value, i) => {
  accum[value.id] = value;
  return accum;
})
out = Object.keys(obj).map(key => obj[key]);