Нарисуйте фигуры в форме рекурсивно Fabric.js

== сравнивает ссылки на объекты.

.equals() сравнивает значения String.

Иногда == дает иллюзии сравнения значений String, как в следующих случаях:

String a="Test";
String b="Test";
if(a==b) ===> true

Это связано с тем, что при создании любого строкового литерала JVM сначала ищет этот литерал в пуле строк, и если он найдет совпадение, эта же ссылка будет передана новой String. Из-за этого получаем:

(a == b) ===> true

                       String Pool
     b -----------------> "test" <-----------------a

Однако == не выполняется в следующем случае:

String a="test";
String b=new String("test");
if (a==b) ===> false

В этом случае для new String("test") оператор new String будет создан в куче, и эта ссылка будет указана на b, поэтому b будет дана ссылка на кучу, а не на String pool.

Теперь a указывает на String в пуле String, а b указывает на String в куче. Из-за этого мы получаем:

, если (a == b) ===> false.

                String Pool
     "test" <-------------------- a

                   Heap
     "test" <-------------------- b

Пока .equals() всегда сравнивает значение String, поэтому дает true в обоих случаях:

String a="Test";
String b="Test";
if(a.equals(b)) ===> true

String a="test";
String b=new String("test");
if(a.equals(b)) ===> true

Таким образом, использование .equals() всегда лучше.

0
задан Narendra Jadhav 13 July 2018 в 11:01
поделиться

1 ответ

Вот пример использования рекурсии по имени. В основном вам нужно определить, является ли свойство объекта JSON массивом, затем снова вызовите функцию рекурсии, иначе проверьте, является ли имя свойства «имя», а затем вызывает функцию для рисования по имени:

var obj = {
    "name": "BAY_01",
    "type": "Bay",
    "_links": [{
        "name": "SERVER_01",
        "type": "Server",
        "_links": [{
            "name": "CPU"
        }, {
           "name": "SERVER_02",
        	 "type": "Server",
        	 "_links": [{
             "name": "CPU2"
        	}]
    	}]
      }]
};

function goThroughtObject(obj, name) {
  var key;
  if (obj instanceof Array) {
    return obj.map(function(value) {
        if (typeof value === "object") {
          goThroughtObject(value, name)
        }
        return value;
    })
  } else {
    for (key in obj) {
      if (obj.hasOwnProperty(key)) {
      	if (key === name){   
      		drawByName(obj[key]);
        }
        if (obj[key] instanceof Array || (obj[key] !== null && obj[key].constructor === Object)) {
          goThroughtObject(obj[key], name);
        }
      } 
    }
  }
};

//implement fabricjs logic in this function
function drawByName (name) {
	console.log("Fabricjs will draw a: " + name);
}

goThroughtObject(obj, 'name');

Не забывайте использовать функцию canvas.renderAll(); после функции рекурсии, если она будет лучше.

1
ответ дан Observer 17 August 2018 в 13:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: