2015-11-29 9 views
-2

Я новичок в JavaScript. Я ранее работал на других языках программирования (C, C++ и т. Д.). Я не понимаю, что делает заявление a[arr1[i]]=true;. Пожалуйста, помогите мне понять это. Благодарю.Что делает [arr1 [i]] = true?

function diff(arr1, arr2) { 
    var newArr = []; 
    // Same, same; but different. 

    var a=[]; 
    for(var i=0;i<arr1.length;i++) 
     a[arr1[i]]=true; 

    for(var j=0;j<arr2.length;j++) 
     if(a[arr2[j]]) 
      delete a[arr2[j]]; 
     else 
      a[arr2[j]]=true; 

    for(var k in a) 
     newArr.push(k); 

    return newArr; 
} 
+3

Существуют эквивалентные конструкции как на C, так и на C++, о которых вы заявляете. – Blindy

+0

@Blindy: В других C, C++ мы обычно предоставляем индекс массива внутри '[]'. Странно видеть массив как индекс внутри другого массива. –

+0

Это индексы. Я не понимаю, что вводит в заблуждение, вы индексируете 'a' с' arr1 [i] ', снова идентичным их эквивалентным конструкциям C и C++. – Blindy

ответ

1

Кажется, что a список булевых, так что особое задание устанавливает один из индексов a «s к true. Этот индекс вычисляется путем разыменования arr1.

В приведенном выше комментарии вы выразили беспокойство о том, что массив используется как индекс внутри другого массива. Но не нужно беспокоиться об этом, потому что это не сам массив (а именно arr1), который используется как индекс, а элемент этого массива (например, arr1[i], для некоторого i).

0

Такая же логика, как и на языках высокого уровня, применима и здесь.

Это можно легко прояснить, разделив это на мелкие блоки.

a[arr1[i]]=true; 

arr1 - массив целочисленных

а - массив булевых

0

Вы задаетесь вопросом о синтаксисе a[arr1[i]]. Это просто:

  • arr1[i] значение индекса для массива a.
  • Если значение arr1[i] - это число, например, 5. Так будет: a[5]=true. В этом случае ничего особенного.
  • Как вы сказали в комментарии, arr1[i] может быть, например, string, "boy". Тогда это будет: a["boy"]=true.

Вы должны знать, что индекс массива в JavaScript может быть строкой. Но будьте осторожны, как сказал W3School, если вы используете именованный индекс, JavaScript переопределит массив стандартным объектам. После этого все методы и свойства массива будут давать неверные результаты. Например:

var person = []; 
person["firstName"] = "John"; 
person["lastName"] = "Doe"; 
person["age"] = 46; 
var x = person.length;   // person.length will return 0 
var y = person[0];    // person[0] will return undefined 

Для более подробной информации, обратите внимание на предупреждение части в W3School об этом.

0

Вот код с комментариями, объясняя, что происходит и выход

var arr1 = [1,2,'foo','bar']; 
var arr2 = [2,3,'foo']; 
var diff = diff(arr1, arr2); 

console.log(diff); // ["1", "3", "bar"] 

function diff(arr1, arr2) { 
    var newArr = []; 
    var a=[]; 

    // Loop through arr1 
    // set the value of each entry as an index in array `a` 
    // set the value of the entry in `a` to true 
    for(var i=0;i<arr1.length;i++) 
     a[arr1[i]]=true; 
    // console.log(a); // [1: true, 2: true, foo: true, bar: true] 

    // Loop through arr2 
    // check if each entry exists as an index in array `a` 
    // if it does, delete the value from array `a` 
    // if not, set the value of the entry in `a` to true 
    for(var j=0;j<arr2.length;j++) 
     if(a[arr2[j]]) 
      delete a[arr2[j]]; 
     else 
      a[arr2[j]]=true; 
    // console.log(a); // [1: true, 3: true, bar: true] 

    // put all of the indexs of array `a` to values in `newArr` 
    for(var k in a) 
     newArr.push(k); 

    return newArr; 
} 

http://jsfiddle.net/daCrosby/6rcf1j72/


образца С кодовой очисткой стороны, если вы хотите более короткую функцию, которую вы могли бы использовать что-то вроде одного из них:

console.log("Looping", diffLoop); // [1, "bar", 3] 
console.log("Filtering", diffFilter); // [1, "bar", 3] 

function diffLoop(arr1, arr2){ 
    var arr = arr1; 

    for(var j=0; j<arr2.length; j++) 
     if(arr.indexOf(arr2[j]) > -1) 
      arr.splice(arr.indexOf(arr2[j]), 1); 
     else 
      arr.push(arr2[j]); 
    return arr; 
} 

function diffFilter(arr1, arr2){ 
    var arr = arr1.concat(arr2); 
    return arr.filter(function(i) { 
     var in1 = arr1.indexOf(i) < 0; 
     var in2 = arr2.indexOf(i) < 0; 
     return (in1 || in2) && !(in1 && in2); 
    }); 
} 

http://jsfiddle.net/daCrosby/6rcf1j72/1/

Смежные вопросы