我是一名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;
}
答案 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);
});
}