如何基于字段从javascript对象中删除一行并重新排列对象

How to remove a row from the javascript object based on a field and realign the object

本文关键字:对象 一行 新排列 排列 何基于 字段 javascript 删除      更新时间:2023-09-26

我有下面的javascript对象

temp=[
{'id': 0, 'name': 'Housing', 'value': 3}, 
{'id': 1, 'name': 'Bank', 'value': 8}, 
{'id': 2, 'name': 'Entertainment', 'value': 3},
{'id': 3, 'name': 'Restaurant', 'value': 3},
{'id': 4, 'name': 'Groceries', 'value': 7}
]

我想删除基于名称字段的行。

示例:如果我调用名为"Entertainment"的函数,我希望删除该特定行并重新调整id(0,1,2,3…)所有其他行都应该在那里。

功能完成后,温度应为

temp=[
{'id': 0, 'name': 'Housing', 'value': 3}, 
{'id': 1, 'name': 'Bank', 'value': 8}, 
{'id': 2, 'name': 'Restaurant', 'value': 3},
{'id': 3, 'name': 'Groceries', 'value': 7}
]

我该怎么做?

我试过以下内容:

function realign(tagrm)
{
                   temp.each(function (i, elem) { 
                    temp[i] = { 
                        if(temp[i][name]==tagrm)
                        delete temp[i]              
                      }
}

我如何才能删除特定的行,并将其他行的id重新调整为0,1,2,3?

尝试使用Array.prototype.splice()Array.prototype.forEach()、递归

var match = "Entertainment";
function filter(arr, m, i) {
  if (i < arr.length) {
    if (arr[i].name === m) {
      arr.splice(i, 1);
      arr.forEach(function(val, index) {
        val.id = index
      });
      return arr
    } else {
      return filter(arr, m, i + 1)
    }
  } else {
      return m + " not found in array"
  }
}
filter(temp, match, 0)

var temp = [{
  'id': 0,
  'name': 'Housing',
  'value': 3
}, {
  'id': 1,
  'name': 'Bank',
  'value': 8
}, {
  'id': 2,
  'name': 'Entertainment',
  'value': 3
}, {
  'id': 3,
  'name': 'Restaurant',
  'value': 3
}, {
  'id': 4,
  'name': 'Groceries',
  'value': 7
}]
var match = "Entertainment";
function filter(arr, m, i) {
  if (i < arr.length) {
    if (arr[i].name === m) {
      arr.splice(i, 1);
      arr.forEach(function(val, index) {
        val.id = index
      });
      return arr
    } else {
      return filter(arr, m, i + 1)
    }
  } else {
      return m + " not found in array"
  }
}
console.log(filter(temp, match, 0), JSON.stringify(temp, null, 2))

尝试以下

var temp = [
   {'id': 0, 'name': 'Housing', 'value': 3}, 
   {'id': 1, 'name': 'Bank', 'value': 8}, 
   {'id': 2, 'name': 'Entertainment', 'value': 3},
   {'id': 3, 'name': 'Restaurant', 'value': 3},
   {'id': 4, 'name': 'Groceries', 'value': 7}
]
function realign(tagrm) {
    var counter = 0;
    // filters the result by removing any object with the name passes
    temp = temp.filter(function (item) { 
        return item.name != tagrm;      
     });
    // reset the id
    temp = temp.map(function(item){
     item.id = counter++;
      return item;
    });
}
realign('Entertainment');
console.log(temp);

您不应该使用常规循环来删除项,因为它会扰乱数组的length属性,从而导致for循环尝试删除不再存在的属性。

您可以使用Array.prototype.filter从数组中删除项并返回新副本。如果条件为true,则保留该条目,否则将删除该条目。

然后你可以使用Array.prototype.map重新分配你的id(尽管@FelixKling有一个很好的观点,你可能根本不需要额外的id):

function realign(temp, tagrm) {
  return temp.filter(function (item) { 
    return item.name != tagrm;    
  }).map(function (item, index) {
    item.id = index;
    return item;
  });
}

然后您可以将其用作:

var temp=[
  {'id': 0, 'name': 'Housing', 'value': 3}, 
  {'id': 1, 'name': 'Bank', 'value': 8}, 
  {'id': 2, 'name': 'Entertainment', 'value': 3},
  {'id': 3, 'name': 'Restaurant', 'value': 3},
  {'id': 4, 'name': 'Groceries', 'value': 7}
];
temp = realign(temp, 'Entertainment'); // Removes 'Entertainment'
console.log(temp);

另一种方法是使用:

jQuery.grep():查找数组中满足筛选函数的元素。原始数组不受影响。

所以代码将是:

temp=$.grep(temp,function(el,idx){return el.name=="Entertainment"},true);