Пуредача элемента массива в функцию
Добрый день!
Начну вопрос с примера.
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, время: 21:32. |