[arr1 [i]] = true有什么作用?

时间:2015-11-29 06:08:05

标签: javascript

我是一名JavaScript新手。我之前曾在其他编程语言(C,C ++等)工作过。我不明白a[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;
}

4 个答案:

答案 0 :(得分:1)

a似乎是一个布尔列表,因此特定的作业将a的索引之一设置为true。该索引通过解除引用arr1来计算。

在上面的评论中,您表示担心数组被用作另一个数组中的索引。但不必担心,因为它不是数组本身(即arr1)用作索引,而是该数组的元素(即arr1[i] },对某些人而言。)

答案 1 :(得分:0)

与高级语言相同的逻辑也适用于此。

这很容易澄清,将其拆分为小块。

a[arr1[i]]=true;

arr1 - 整数数组

a - 布尔值

的数组

答案 2 :(得分:0)

您想知道语法a[arr1[i]]。这很简单:

  • arr1[i] value是数组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中有关此问题的警告部分。

答案 3 :(得分: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/