2015-03-18 3 views
1

Я хочу объединить два объекта json. Трудность здесь состоит в том, что слияние находится в массиве. Единственный способ узнать, где слить, - это свойство «имя».JSON merge and override array

  1. Есть ли простое решение, чтобы сделать то, что я хочу, с текущей структурой?
  2. Не могли бы вы изменить структуру JSON, например, иметь имя в качестве ключа для облегчения слияния?

Мой главный объект состоит в следующем:

{ 
    "servers": { 
     "services": [ 
      { 
       "name": "api" 
       "prop1": "XXX", 
       "prop2": "XXX" 
      }, 
      { 
       "name": "web" 
       "prop1": "XXX", 
       "prop2": "XXX" 
      } 
     ] 
    } 
} 
нуждается

сервис "Web", чтобы быть overrriden с:

{ 
    "servers": { 
     "services": [ 
      { 
       "name": "web" 
       "prop1": "overriden value" 
      } 
     ] 
    } 
} 

Объект должен быть результат:

{ 
    "servers": { 
     "services": [ 
      { 
       "name": "api" 
       "prop1": "XXX", 
       "prop2": "XXX" 
      }, 
      { 
       "name": "web" 
       "prop1": "overriden value", 
       "prop2": "XXX" 
      } 
     ] 
    } 
} 
+0

Так что это проблема? Вы можете перебирать массив и изменять значения, которые соответствуют некоторым критериям, или вы можете изменить структуру json. –

+0

Да, это то, что я сделал здесь: http://pastebin.com/rgTVqY8X метод переопределения использует https://github.com/lukebond/json-override. Это не очень красиво, но это делает работу – Zaibes

ответ

2

Я сделал пакет узлов, он немного переполнен, but it will do the job, called json_merger:

// https://www.npmjs.com/package/json_merger 
var json_merger = require('json_merger'); 

var a = { 
    "servers": { 
     "services": [ 
      { 
       "name": "api" 
       "prop1": "XXX", 
       "prop2": "XXX" 
      }, 
      { 
       "name": "web" 
       "prop1": "XXX", 
       "prop2": "XXX" 
      } 
     ] 
    } 
}; 

var b = { 
    "servers": { 
     "services": [ 
      { 
       "@match": "[name=web]", 
       "prop1": "overriden value" 
      } 
     ] 
    } 
} 

var result = json_merger.merge(a, b); 

Но с любым приличным инструментом объединения было бы perserve индексы:

// This is pseudo code: 
var a = [{...}, {...}, {...}] 

// to override object at index 1 you should be able to do this: 
merge(a, [{/*intentional empty object, so we get index up*/}, 'new value at index 1']); 
+1

Спасибо за совместное использование, я бы хотел, чтобы я мог проголосовать, но нужно 15 репутации :) – Zaibes

+2

@Zaibes Это нормально, это не о upvotes и т. Д., А о помощи людям. – andlrc