Пуредача элемента массива в функцию
Добрый день!
Начну вопрос с примера. var arr = { title: "Obect", elements: [ { id: 1, title: "Element 1" }, { id: 2, title: "Element 2" } ] }; function processElement(item) { item = { id: 999, title: "New Item" }; } processElement(arr.elements[1]); console.log(arr); Как верно передать ссылку на элемент массива в фунцию? Чтобы при изменении элемента, изменялся соответствующий элемент в массиве. в данном случае ожадаю: { title: "Obect", elements: [ { id: 1, title: "Element 1" }, { id: 999, title: "New Item" } ] } а получаю: { title: "Obect", elements: [ { id: 1, title: "Element 1" }, { id: 2, title: "Element 2" } ] } Ссылка на пример: http://jsfiddle.net/b0f3ka5q/ |
ты в корне неверно понимаешь код. Ты передал в функцию ссылку на объект. Но в функции ты эту ссылку адресуешь на другой объект. Тебе надо не ссылку на объект в таком случае передавать, а индекс объекта в массиве. И новый объект класть по указанному индексу непосредственно в массив. Либо не заморачиваться с индексами и массивами, а брать твой новый объект, в цикле идти по его свойствам и подкладывать нужные в исходный объект.
|
Цитата:
Я привык к такому class Obj { public $title; public $elements; public function __construct() { $this->title = "Object"; $this->elements = [new Element(1, "Elements 1"), new Element(2, "Elements 2")]; } } class Element { public $id; public $title; public function __construct($id, $title) { $this->id = $id; $this->title = $title; } } function processElement(&$item) { $item = new Element(999, "New Element"); } $o = new Obj(); processElement($o->elements[1]); var_dump($o); В итоге получаю то, что ожидаю: object(Obj)#1 (2) { ["title"]=> string(6) "Object" ["elements"]=> array(2) { [0]=> object(Element)#2 (2) { ["id"]=> int(1) ["title"]=> string(10) "Elements 1" } [1]=> object(Element)#4 (2) { ["id"]=> int(999) ["title"]=> string(11) "New Element" } } } Именно поэтому я пытаюсь найти аналогичную возможность в яваскрипте. За совет спасибо. Я такой подход рассматривал. Он мне не подходит. В реальном приложении объект довольно сложный, многовложенный. |
var arr = { title: "Obect", elements: [ { id: 1, title: "Element 1" }, { id: 2, title: "Element 2" } ] }; function processElement(item,x) { return item[x] = { id: 999, title: "New Item" }; } processElement(arr.elements, 1); console.log(arr); Если не хочешь передавать два аргумента есть такой костыль ))) Array.prototype.processElement = function (i) { this.splice(i,i+1, { id: 999, title: "New Item" }) } arr.elements.processElement(1) ИЛИ так arr.elements.splice(1,2, { id: 999, title: "New Item" }) |
Цитата:
|
ты прав не зачем.
с утра писал код, тормознул! |
Часовой пояс GMT +3, время: 06:42. |