Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Пуредача элемента массива в функцию (https://javascript.ru/forum/misc/56640-puredacha-ehlementa-massiva-v-funkciyu.html)

Dima_S 26.06.2015 13:00

Пуредача элемента массива в функцию
 
Добрый день!

Начну вопрос с примера.
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/

demoniqus 26.06.2015 13:10

ты в корне неверно понимаешь код. Ты передал в функцию ссылку на объект. Но в функции ты эту ссылку адресуешь на другой объект. Тебе надо не ссылку на объект в таком случае передавать, а индекс объекта в массиве. И новый объект класть по указанному индексу непосредственно в массив. Либо не заморачиваться с индексами и массивами, а брать твой новый объект, в цикле идти по его свойствам и подкладывать нужные в исходный объект.

Dima_S 26.06.2015 13:31

Цитата:

Сообщение от demoniqus
ты в корне неверно понимаешь код.

Именно, иначе этого вопроса бы не было.

Я привык к такому
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"
    }
  }
}


Именно поэтому я пытаюсь найти аналогичную возможность в яваскрипте.

За совет спасибо. Я такой подход рассматривал. Он мне не подходит. В реальном приложении объект довольно сложный, многовложенный.

caetus 26.06.2015 13:59

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" })

Dima_S 26.06.2015 14:26

Цитата:

Сообщение от caetus
есть такой костыль

Мысль ясна. спасибо.

caetus 29.06.2015 04:31

ты прав не зачем.
с утра писал код, тормознул!


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