如何基于字段从javascript对象中删除一行并重新排列对象
How to remove a row from the javascript object based on a field and realign the object
我有下面的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);
相关文章:
- 实例化一个javascript对象并在一行中填充其属性
- 有没有办法检查一个对象是否存在并且在一行中有一个子对象
- 如何知道JS对象属性的值在哪一行发生了更改
- 使用XmlHttpResponse对象一次读取一行
- 在一行中生成 ajax 对象
- 挖空.js按钮读取对象列表中的一行
- 如何在 JavaScript 中将对象值从本地存储提取到每一行
- 使用 jQuery 将对象绑定到一行
- iCanHaz.js+胡子没有't渲染数据对象中的第一行
- 如何基于字段从javascript对象中删除一行并重新排列对象
- 使用Parse.com保存查询中的对象,限制为第一行
- javascript中的对象卡在csv文件的最后一行
- 在一行中使用键:值创建对象
- 在一行中使用对象循环和数组循环
- 如何在一行中初始化和返回对象
- 用对象键在一行中声明和分配函数对象
- 将对象映射到一行中的key=value字符串
- 如何构造Date对象实例并在同一行调用其函数
- 用于一行中的多个对象的事件侦听器
- 如何在一行上移动对象并删除旧对象,以便它不会在HTML5 Canvas中留下尾部