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');