Javascript 在数组中查找对象,然后对其进行编辑
假设我有以下数组:Javascript 在数组中查找对象,然后对其进行编辑,javascript,jquery,Javascript,Jquery,假设我有以下数组: var things = [ { id: "12345", name: "Bryan" }, { id: "55555", name: "Justin" } ] 我想搜索id为55555的对象。但我想从贾斯汀那里把那个特殊物体的名字更新为“迈克”,但仍然保持整个军队的完整 目前,我找到了一种搜索对象的方法,但是我找不到一个解决方案来编辑这个特定的搜索结果 有人能帮我吗?这就是我到
var things = [
{
id: "12345",
name: "Bryan"
},
{
id: "55555",
name: "Justin"
}
]
我想搜索id为55555
的对象。但我想从贾斯汀那里把那个特殊物体的名字更新为“迈克”,但仍然保持整个军队的完整
目前,我找到了一种搜索对象的方法,但是我找不到一个解决方案来编辑这个特定的搜索结果
有人能帮我吗?这就是我到目前为止所做的:
var thing = things.filter(function (item) {
return "55555" === item.id;
})[0]
一个查找正确ID并更改名称的函数怎么样
var事物=[
{
身份证号码:“12345”,
姓名:“布莱恩”
},
{
id:“55555”,
姓名:“贾斯汀”
}
]
函数更新(id、值、arr){
arr.forEach(功能(项目){
如果(item.id==id){
item.name=值;
返回false;
}
});
}
更新(“55555”,“迈克”,东西);
document.body.innerHTML=''+JSON.stringify(things,null,4)+''代码>我只需在数组上循环,检查ID是否匹配并编辑名称
for (var i = 0; i < things.length; i++) {
if (things[i].id == "55555") {
things[i].name = "new name";
}
}
var things = [
{
id: "12345",
name: "Bryan"
},
{
id: "55555",
name: "Justin"
}
], reference = things.map(function(a){ return a.id });;
function replace (id, name, ar, ref) { ref.indexOf(id)>-1&&(ar[ref.indexOf(id)]['name']=name); }
replace("55555", "Phil", things, reference);
for(var i=0;i
为了提高效率,您可以存储每个项目的位置,然后使用该位置引用名称:
[].indexOf||(Array.prototype.indexOf=function(a,b,c){for(c=this.length,b=(c+~~b)%c;b<c&&(!(b in this)||this[b]!==a);b++);return b^c?b:-1;})
在这种情况下,您只需要循环一次。然后所有信息都存储在参考
变量中reference
存储id
所在的位置,我们使用它来避免循环。我不确定编译器在做什么,也不确定它是否循环,但这感觉更有效
.indexOf不完全受支持,因此您可以使用PollyFill
将以下代码添加到JavaScript文件的顶部:
Array.prototype.map||(Array.prototype.map=function(r,t){var n,o,e;if(null==this)throw new TypeError(" this is null or not defined");var i=Object(this),a=i.length>>>0;if("function"!=typeof r)throw new TypeError(r+" is not a function");for(arguments.length>1&&(n=t),o=new Array(a),e=0;a>e;){var p,f;e in i&&(p=i[e],f=r.call(n,p,e,i),o[e]=f),e++}return o});
以及:
function findElementByPropertyValue(arr, propertyName, propertyValue) {
for (var i = 0, count = arr.length; i < count; i++) {
var element = arr[i];
if (element[propertyName] === propertyValue) {
return element;
}
}
return null;
}
检索自:,以及
注意:虽然IE 8及以下版本不支持indexOf
,但实际上其他浏览器都支持。使用.filter()
是低效的,因为它在找到要查找的项目后会不断迭代
您可以这样定义一个通用函数:
var mike = findElementByPropertyValue(things, 'id', '55555');
if (mike) {
mike.name = 'Mike';
}
function createHashByProperty(arr, propertyName) {
var hash = {};
for (var i = 0, count = arr.length; i < count; i++) {
var element = arr[i];
hash[element[propertyName]] = element;
}
return hash;
}
function removeElementByPropertyValue(arr, propertyName, propertyValue) {
for (var i = 0, count = arr.length; i < count; i++) {
if (arr[i][propertyName] === propertyValue) {
arr.splice(i, 1);
return;
}
}
}
如果需要更改数组中的许多元素,可能需要创建一个哈希对象
var hash = createHashByProperty(things, 'id');
hash['55555'].name = 'Mike'; // Was 'Justin'
hash['12345'].name = 'Brian'; // Was 'Bryan'
上面的两个函数不改变数组,它们只允许您获取对数组中元素的引用,因此您可以改变这些元素
如果要从数组中删除元素,则需要获取其索引。然后可以使用该函数删除该元素
这里有一个函数可以执行此操作:
removeElementByPropertyValue(things, 'id', '55555');
注意:此答案中的代码使用纯JavaScript;它不依赖于jQuery库。如果我必须对一个非常大的数组执行100次不同的搜索,那么有没有更好的方法来执行此操作,或者是通过最佳选项进行循环?@bryan你几乎总是会以这样或那样的方式进行循环。如今,计算机可以以惊人的速度循环浏览数千个条目,因此我不必担心速度。如果你必须进行100次搜索,它们可能是更好的方法,例如迭代一次并使用地图进行替换。这很有意义。快速问题,而不是编辑值,是否有一个简单的解决方案来删除找到的“东西”?当然,您可以执行删除项。name
东西。name=“Mike”代码>?我认为indexOf没有跨浏览器支持,或者这种想法听起来很可靠。@byran我添加了polyfills以支持IE 8及以下版本
removeElementByPropertyValue(things, 'id', '55555');