Member 13127114 Ответов: 1

Может ли кто-нибудь объяснить этот код javascript, пожалуйста? Он используется для вывода уникальных значений из двух массивов.


функция unique (array1, array2) {
var obj1 = {};
для (ВАР я = массив1.длина-1; я &ГТ;= 0; - я)
obj1[array1[i]] = array1[i];
для (ВАР я = массив2.длина-1; я &ГТ;= 0; - я)
obj1[array2[i]] = array2[i];
результат var = []
for (var k в obj1) {
результат +=(obj1[k]);

}
возвращаемый результат;
}

Что я уже пробовал:

Я просто хочу точно знать, как это работает, но когда я смотрю на это в отладчике браузера, это не имеет особого смысла.

Patrice T

Пожалуйста, не удаляйте вопрос после того, как он будет решен.

OriginalGriff

Откатился - иначе решение бессмысленно ...

Patrice T

++

1 Ответов

Рейтинг:
1

Nick_3141592654

Я думаю, что это будет работать только в том случае, если array1 и array2 являются массивами строковых переменных, это не будет работать для произвольных типов массивов.

Кроме того, эти строки не могут быть произвольными. В частности, они не могут содержать пробелов (элемент массива "что-то" не будет работать, но "что-то" будет в порядке).

Я аннотировал код ниже, чтобы объяснить это. Кто бы это ни написал, ему должно быть немного стыдно за то, что он не предоставил некоторых пояснительных комментариев, не в последнюю очередь заголовка функции для объяснения требуемых типов аргументов. Попробовать-catch блок не пошло вкривь и вкось либо.

В любом случае вот так:

function unique (array1, array2) {

   var obj1 = {};  // Declare a new object (see reference below).


    // Loop over array1, working from end to beginning.
    // Take each string element and use this as a key for
    // a to-be-created new property within obj1, that property
    // being assigned the same string value.
    for (var i = array1.length-1; i >= 0; -- i)
      obj1[array1[i]] = array1[i];

    // Similarly loop over array2, copying each element (string
    // value) into obj1 as a property.
    //
    // This is where the uniqueness is achieved because if
    // array2[i] was also contained within array1[<any index>]
    // then this particular string value will already exist
    // within obj1 and the loop below will simply overwrite the
    // same value on top of the existing property.
    for (var i = array2.length-1; i >= 0; -- i)
      obj1[array2[i]] = array2[i];

    // Declare an array to store results.
    var result = []

    // Copy property values from obj1 into the results. These
    // properties are the set of strings which are uniquely listed
    // in array1, array2.
    for (var k in obj1) {
      result +=(obj1[k]);
    }

    return result;
}


Декларация obj1 следует следующим образом Лучшая практика Javascript для объявления нового объекта.

Ключ к пониманию приведенного выше кода заключается в следующем:

Рассмотрим объект Javascript myObj, содержащий такие свойства, как" prop1"," prop2 " и т. д. Вы, вероятно, знакомы с доступом к этим объектам с помощью этой нотации:
var prop1Val = myObj.prop1;
var prop2Val = myObj.prop2;

Однако вы также можете получить доступ к этим свойствам, используя эту нотацию:
var prop1Val = myObj["prop1"];
var prop2val = myObj["prop2"];


Надеюсь, теперь вы понимаете, почему я сказал в самом начале, что array1, 2 должен содержать только простые строки, которые не содержат пробелов. Если бы они это сделали, вы бы попытались сделать что-то подобное:
var prop1Val = myObj["some thing"];

Что, как вы теперь знаете, соответствовало бы, в более знакомой нотации,:
var prop1Val = myObj.some thing;  // WHICH IS AN INVALID SYNTAX!


Любой, кто сомневался в красоте Javascript, не может по-настоящему знать этот язык. Подобные конструкции - хотя они и могут сбивать с толку-обладают исключительной силой. Это язык, который значительно опередил свое время!


Member 13127114

Большое вам спасибо! Это действительно помогло, я не совсем понимал, как работают объекты.