function unusedDigits(...a){
return `0123456789`.split('').filter(
b => `${a}`.split('').indexOf(b) == -1
).join('');
}
document.write(unusedDigits(12345))

什么是 ${a}
什么是 =>
如果有人可以为我分解这段代码,那就太棒了!
答案 0 :(得分:11)
1,什么是$ {a}
这是新JavaScript template string中的替代(由ES2015添加)。它交换a
的值。接受任意表达。
2,什么是=>
这是ES2015 arrow function。
你没有问,但函数声明中...
参数之前的a
是" rest operator"那说"给我作为数组提供给函数的(其余的)参数。
如果有人可以为我分解这段代码,那就太棒了!
它返回一个字符串,其中包含不会以传递给它的任何参数的字符串形式出现的数字:
unusedDigits
函数接受任意数量的参数,它作为通过a
参数访问的数组接收(感谢...
rest运算符在{{1}的声明中1}}参数)。a
)。['0', '1', ...]
函数循环遍历该数组,获取一个仅包含filter
回调所说的条目的新数组。filter
回调(ES2015箭头函数)使用ES2015模板字符串创建包含filter
数组的字符串。由于这涉及隐式调用a
,它最终会隐式执行a.toString()
(因为那是a.join(",")
所做的),然后检查是否检查了数字(Array#toString
)出现在结果字符串中。 (这不是很有效;没有理由每次都重新创建字符串,并且没有理由在这里使用模板字符串。)只有当数字不在字符串中时才返回真值( b
已返回indexOf
)。这是一个更有效的版本,FWIW:Live Copy on Babel's REPL
-1
与ES5中的功能相同:
let unusedDigits = (function() {
const digits = [0,1,2,3,4,5,6,7,8,9];
return function unusedDigits(...a) {
let astring = String(a);
return digits.filter(b => astring.indexOf(b) == -1).join("");
};
})();
console.log(unusedDigits(12345));
(var unusedDigits = (function() {
var digits = [0,1,2,3,4,5,6,7,8,9];
var slice = Array.prototype.slice;
return function unusedDigits() {
var astring = String(slice.call(arguments));
return digits.filter(function(b) { return astring.indexOf(b) == -1}).join("");
};
})();
事物将伪数组slice
转换为真实数组。)
arguments

var unusedDigits = (function() {
var digits = [0,1,2,3,4,5,6,7,8,9];
var slice = Array.prototype.slice;
return function unusedDigits() {
var astring = String(slice.call(arguments));
return digits.filter(function(b) { return astring.indexOf(b) == -1}).join("");
};
})();
snippet.log(unusedDigits(12345));

答案 1 :(得分:1)
function unusedDigits(...a){
return `0123456789`.split('').filter(b=>`${a}`.split('').indexOf(b)==-1).join('');
}
alert(unusedDigits(12345))
...第一行中的a是rest运算符 - 这会将arguments数组分配给函数体内的变量a(因此您不必处理Array.prototype.slice.call(arguments)在这种情况下,var a = [12345]
'0123456789'.split('')会将0-9中的所有数字拆分成一个数组 - 然后我们将其过滤掉。
b => ${a}
。split('')。indexOf(b)== - 1是过滤器的谓词函数。 =>被称为'胖箭头语法'或'箭头功能'。这是ES6 - 它是函数的简写语法,它还将当前“this”绑定绑定到函数。如果正文在同一行,它将隐式返回表达式。
${a}
是模板字符串语法 - 在这种情况下将我们的参数数组[12345]强制转换为'12345',然后我们将其拆分为执行操作索引以查看当前数字(b)是否为分割参数数组中有0-9位数字。在它结束时,我们返回所有那些不在arguments数组中的数字0-9的过滤结果,以字符串形式连接 - 在本例中为'06789'。
答案 2 :(得分:0)
语言功能:
`${1}`;
// gives "1"
var v = 1; `${v}${v}`;
// gives "11"
x => x != "2";
// same as function (x) { return x != "2"; }
(x => x != "2")("1");
// gives true
((u, ...v) => v)(1, 2, 3);
// gives [2, 3]
字符串和数组方法:
"123".split("");
// gives ["1", "2", "3"]
["1", "2", "3"].join("");
// gives "123"
["1", "2", "3"].indexOf("2");
// gives 1
["1", "2", "3"].indexOf("4");
// gives -1
["1", "2", "3"].filter(x => x != "2");
// gives ["1", "3"]
接近你的代码(转换函数非常糟糕,不要使用它们,我只是想为前面的代码提供一些上下文):
var itos = i => `${i}`; // integer to string
var stoa = s => s.split(""); // string to array
var atos = a => a.join(""); // array to string
var isIn = (x, set) => set.indexOf(x) != -1;
var unusedDigits = function (i) {
// allDigits is ["0", "1", ..., "9"]
var allDigits = stoa("0123456789");
// if i is 12 then usedDigits is ["1", "2"]
var usedDigits = stoa(itos(i));
// convert filtering result to a string
return atos(
// make a set of digits not in usedDigits
allDigits.filter(
// d will be "0" then "1" ... until "9"
d => !isIn(d, usedDigits)
)
);
};
document.write(JSON.stringify(
unusedDigits(13579) // gives "02468"
));