Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.06.2015, 13:00
Новичок на форуме
Отправить личное сообщение для Dima_S Посмотреть профиль Найти все сообщения от Dima_S
 
Регистрация: 26.06.2015
Сообщений: 3

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

Начну вопрос с примера.
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/
Ответить с цитированием
  #2 (permalink)  
Старый 26.06.2015, 13:10
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 181

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

Последний раз редактировалось demoniqus, 26.06.2015 в 13:13.
Ответить с цитированием
  #3 (permalink)  
Старый 26.06.2015, 13:31
Новичок на форуме
Отправить личное сообщение для Dima_S Посмотреть профиль Найти все сообщения от Dima_S
 
Регистрация: 26.06.2015
Сообщений: 3

Сообщение от 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"
    }
  }
}


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

За совет спасибо. Я такой подход рассматривал. Он мне не подходит. В реальном приложении объект довольно сложный, многовложенный.
Ответить с цитированием
  #4 (permalink)  
Старый 26.06.2015, 13:59
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

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

Последний раз редактировалось caetus, 26.06.2015 в 14:06.
Ответить с цитированием
  #5 (permalink)  
Старый 26.06.2015, 14:26
Новичок на форуме
Отправить личное сообщение для Dima_S Посмотреть профиль Найти все сообщения от Dima_S
 
Регистрация: 26.06.2015
Сообщений: 3

Сообщение от caetus
есть такой костыль
Мысль ясна. спасибо.
Ответить с цитированием
  #6 (permalink)  
Старый 26.06.2015, 16:57
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

caetus, а зачем в splice удалять 2 элемента?
Ответить с цитированием
  #7 (permalink)  
Старый 29.06.2015, 04:31
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогу получить индекс элемента массива visman Javascript под браузер 7 03.05.2014 03:23
Проверка длинны элемента массива. ViseNupper Общие вопросы Javascript 2 25.04.2014 14:29
вызвать функцию элемента из массива maXimus-x Events/DOM/Window 1 27.05.2013 15:04
Определить из какого элемента массива была вызвана функция BorodinKO Общие вопросы Javascript 2 31.03.2012 12:20
Как то можно узнать ID HTML элемента вызвавшего JavaScript функцию? Opusel Events/DOM/Window 1 18.12.2011 18:36