2016-03-27 3 views
-1

У меня есть следующие JSON:Заменить ключ: пары значений в формате JSON

var json = [ 
    { 
     "id": "1", 
     "key1": "Name1", 
     "key2": 2, 
     "key3": 1 
    }, 
    { 
     "id": "2", 
     "key1": "Name2", 
     "key2": 2, 
     "key3": 1 
    }, 
    { 
     "id": "3", 
     "key1": "Name3", 
     "key2": 2, 
     "key3": 1 
    } 
] 

И мне нужно, чтобы заменить один объект с другим. Например, я хочу, чтобы заменить:

{ 
    "id": "2", 
    "key1": "Name2", 
    "key2": 2, 
    "key3": 1 
} 

с

{ 
    "id": "5", 
    "key1": "Name7", 
    "key2": 3, 
    "key3": 2 
} 

До сих пор я могу только фильтровать массив объектов:

var id = 2; 
var newObj = {"id": "5", "key1": "Name7", "key2": 3, "key3": 2}; 
var filtered = json.filter(function(el) { 
    return el.id === id; 
}); 
console.log(filtered); 

Что дальше? Как заменить объект id === 2 на newObj?

+0

Это не JSON, это массив объектов, который создается посредством литерального синтаксиса. JSON представляет собой строковое представление объекта/массива. – nnnnnn

+0

Хорошо, спасибо! –

ответ

2

Вы можете использовать метод Array.prototype.findIndex():

var id = "2"; // ids are strings in your json object 
var newObj = {"id": "5", "key1": "Name7", "key2": 3, "key3": 2}; 
var idx = json.findIndex(function(el) { 
    return el.id === id; 
}); 
if (~idx) { // the same as `idx > -1` 
    json[idx] = newObj; 
} 

Однако findIndex не поддерживается во всех браузере, проверить совместимость в вашей среде на MDN.

Вы можете использовать решение кросс-браузер и заменить findIndex с reduce:

var idx = json.reduce(function(r, el, i) { 
    return !~r && el.id === id ? i : r; 
}, -1); 
0

=== означает «равенство без типа принуждения», так что вы можете преобразует число в строку,

var id = 2; //id a number, but json[i].id is string 
var newObj = {"id": "5", "key1": "Name7", "key2": 3, "key3": 2}; 
var filtered = json.filter(function(el) { 
    return el.id === String(id); // or id.toString() and id + '' 
}); 
console.log(filtered); 
Смежные вопросы