Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Добавление данных в JSON (https://javascript.ru/forum/misc/63133-dobavlenie-dannykh-v-json.html)

dmi 19.05.2016 20:50

Добавление данных в JSON
 
Добрый день.
Перерыл весь интернет и посмотрел несколько уроков для ликбеза по json
но не нашел ответа на свой вопрос

есть json код который я получаю через ajax
к примеру такой
[
{"Itemid":35,
  "name":"test",
  "hide":0
},
{"Itemid":36,
  "name":"test22",
  "hide":0
},
{"Itemid":37,
  "name":"test33",
  "hide":0
},
{"Itemid":38,
  "name":"test32",
  "hide":0
}
]

Мне надо вставить в строку с Itemid 37 вставить такое
[{"Itemid":39,
  "name":"test44",
  "hide":0
},
{"Itemid":40,
  "name":"test55",
  "hide":0
}]


чтоб получилось так
[
{"Itemid":35,
  "name":"test",
  "hide":0
},
{"Itemid":36,
  "name":"test22",
  "hide":0
},
{"Itemid":37,
  "name":"test33",
  "hide":0,
  "parent": [{"Itemid":39,
                 "name":"test44",
                  "hide":0
                  },
                 {"Itemid":40,
                   "name":"test55",
                   "hide":0
                 }]
},
{"Itemid":38,
  "name":"test32",
  "hide":0
}
]


единственное что накопал - через concat - но это совсем не то

Скажите хотя б куда посмотреть пожалуйста
Заранее благодарен.

рони 19.05.2016 21:12

dmi,
а запятые где?

рони 19.05.2016 21:16

dmi,
циклом обнаружить нужный элемент в массиве и по его индексу добавить нужное свойство в элемент.

dmi 19.05.2016 21:22

Цитата:

Сообщение от рони (Сообщение 417039)
dmi,
а запятые где?

:-? извиняйте - уже добавил

Только циклом? громоздкое получится решение.

рони 19.05.2016 21:23

dmi,
<script>
var json =  [
{"Itemid":35,
  "name":"test",
  "hide":0
},
{"Itemid":36,
  "name":"test22",
  "hide":0
},
{"Itemid":37,
  "name":"test33",
  "hide":0
},
{"Itemid":38,
  "name":"test32",
  "hide":0
}
], arr = [{"Itemid":39,
  "name":"test44",
  "hide":0
},
{"Itemid":40,
  "name":"test55",
  "hide":0
}]

json.some(function(a) {
   return a.Itemid == 37 && (a.parent = arr)
})
document.write(JSON.stringify(json))

  </script>

dmi 19.05.2016 21:30

рони,
Благодарю, уже копаю в эту сторону

dmi 19.05.2016 22:18

Цитата:

Сообщение от Rise (Сообщение 417046)
dmi, что значит "parent" для 37 что 39 и 40 его родители или наоборот дети?

ошибся - там вместо parent - child
но не суть - попробовал метод Рони и он сработал. Но если я с помощью его функции к примеру хочу добавить еще одну вложенность скажем тоже самое после Итем 39 - то ничего не работает

пример для понимания
[
{"Itemid":35,
  "name":"test",
  "hide":0
},
{"Itemid":36,
  "name":"test22",
  "hide":0
},
{"Itemid":37,
  "name":"test33",
  "hide":0,
  "parent": [{"Itemid":39,
                 "name":"test44",
                  "hide":0
                   "parent": [{"Itemid":41,
                                  "name":"test45",
                                 "hide":0
                                 },
                                 {"Itemid":42,
                                  "name":"test56",
                                 "hide":0
                                }]
                  },
                 {"Itemid":40,
                   "name":"test55",
                   "hide":0
                 }]
},
{"Itemid":38,
  "name":"test32",
  "hide":0
}
]

Rise 19.05.2016 22:25

dmi, тогда так:
[{
	"Itemid":35,
	"name":"test",
	"hide":0
},{
	"Itemid":36,
	"name":"test22",
	"hide":0
},{
	"Itemid":37,
	"name":"test33",
	"hide":0,
	"childId": [39,40]
},{
	"Itemid":38,
	"name":"test32",
	"hide":0
},{
	"Itemid":39,
	"name":"test44",
	"hide":0
},{
	"Itemid":40,
	"name":"test55",
	"hide":0
}]

или так:
[{
	"Itemid":35,
	"name":"test",
	"hide":0
},{
	"Itemid":36,
	"name":"test22",
	"hide":0
},{
	"Itemid":37,
	"name":"test33",
	"hide":0
},{
	"Itemid":38,
	"name":"test32",
	"hide":0
},{
	"Itemid":39,
	"name":"test44",
	"hide":0,
	"parentId":37
},{
	"Itemid":40,
	"name":"test55",
	"hide":0,
	"parentId":37
}]

или всё вместе

рони 19.05.2016 22:27

dmi,
так идите по дереву ищите нужное

dmi 19.05.2016 22:40

Rise,
вопрос как с помощью функции туда поместить, а не как правильно написать слово parent или child

)
В принципе через some работает - но не подходит для многомерного массива
при попытке обратится к элементу в духе a.parent.Itemid - ничего не происходит

рони 19.05.2016 22:49

dmi,
<script>
var json =  [
{"Itemid":35,
  "name":"test",
  "hide":0
},
{"Itemid":36,
  "name":"test22",
  "hide":0
},
{"Itemid":37,
  "name":"test33",
  "hide":0
},
{"Itemid":38,
  "name":"test32",
  "hide":0
}
], arr = [{"Itemid":39,
  "name":"test44",
  "hide":0
},
{"Itemid":40,
  "name":"test55",
  "hide":0
}]

var indx = 0, a = json;

a.some(function(a, i) {
   return a.Itemid == 37 && (indx = i)
})
a = a[indx];
a.parent = arr; //строка для теста
a = a.parent;
a.some(function(a, i) {
  return a.Itemid == 39 && (indx = i)
})
a = a[indx];
a.parent = "abrarkadbra";
document.write(JSON.stringify(json))

  </script>

dmi 19.05.2016 23:24

рони,
Тебе отдельное спасибо за напутствия, в итоге написал рекурсивную функцию, где то в ней есть бок - иногда дублируются значения - найду ошибку исправлю. Для тех кто будет биться над подобной проблемой - оставлю ее тут.

items - начальный json массив
itemid - ид товара в который вгружать данные
data - собственно данные которые надо загрузить

function putItems (items, itemid, data) {
 var i = 0;
 for (i = 0; i < items.length; i++) {
  if (items[i].Itemid == itemid) {
   items[i].parent = data;
   return items;
  }
  var item = putItems(items[i].parent, itemid, data);
  if (item != null) {
   return items.concat(item);
  }
 }
 return null;
}


Часовой пояс GMT +3, время: 23:16.