在数组中查找对象,然后进行编辑

时间:2015-04-25 16:11:03

标签: javascript jquery

我们说我有以下数组:

var things = [
    {
        id: "12345",
        name: "Bryan"
    },
    {
        id: "55555",
        name: "Justin"
    }
]

我想使用55555 id 搜索对象。但我想将该特定对象的名称更新为" Mike "来自贾斯汀,但仍保持整个军队的完整。

目前,我找到了一种搜索对象的方法,但我无法找到实际编辑该特定发现的解决方案。

有人可以帮帮我吗?这就是我到目前为止所做的:

var thing = things.filter(function (item) {
    return "55555" === item.id;
})[0]

4 个答案:

答案 0 :(得分:1)

找到正确ID并更改名称

的函数怎么样?

var things = [
    {
        id: "12345",
        name: "Bryan"
    },
    {
        id: "55555",
        name: "Justin"
    }
]

function updateThings(id, value, arr) {
    arr.forEach(function(item) {
        if (item.id == id) {
           item.name = value;
           return false;
        }
    });
}

updateThings("55555", "Mike", things);

document.body.innerHTML = '<pre>' + JSON.stringify(things, null, 4) + '</pre>';

答案 1 :(得分:1)

我只是遍历数组,检查ID是否匹配并编辑名称。

for (var i = 0; i < things.length; i++) {
    if (things[i].id == "55555") {
        things[i].name = "new name";
    }
}

答案 2 :(得分:1)

使用.filter()效率很低,因为它在找到您要查找的项目后会继续迭代。

您可以定义这样的通用函数:

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;
}

然后像这样使用它:

var mike = findElementByPropertyValue(things, 'id', '55555');
if (mike) {
    mike.name = 'Mike';
}

jsfiddle

如果需要更改数组中的许多元素,可能需要创建一个哈希对象。

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;
}

你可以像这样使用它:

var hash = createHashByProperty(things, 'id');

hash['55555'].name = 'Mike'; // Was 'Justin'
hash['12345'].name = 'Brian'; // Was 'Bryan'

jsfiddle

上面的两个函数不会改变数组,它们只允许您获取对数组中元素的引用,因此您可以更改这些元素。

如果要从数组中删除元素,则需要获取其索引。然后,您可以使用Array.prototype.splice函数删除元素。

这是一个执行此操作的函数:

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;
        }
    }
}

你可以像这样使用它:

removeElementByPropertyValue(things, 'id', '55555');

jsfiddle

注意:本答案中的代码使用纯JavaScript;它不依赖于jQuery库。

答案 3 :(得分:0)

为了提高效率,您可以存储每个项目的位置,然后使用它来引用名称:

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

在此,您只需要循环一次。然后,所有信息都存储在reference变量中。 reference存储id所在的位置,我们用它来避免循环。我不确定编译器在做什么以及它是否循环,但这只是感觉更有效。

.indexOf不完全支持,因此您可以使用PollyFill

将此代码添加到JavaScript文件的顶部:

[].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;})

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

以及:

Array.prototype.forEach||(Array.prototype.forEach=function(r,t){var o,n;if(null==this)throw new TypeError(" this is null or not defined");var e=Object(this),i=e.length>>>0;if("function"!=typeof r)throw new TypeError(r+" is not a function");for(arguments.length>1&&(o=t),n=0;i>n;){var a;n in e&&(a=e[n],r.call(o,a,n,e)),n++}});

取自:hereherehere

注意:虽然IE 8及以下版本几乎不支持indexOf所有其他浏览器。