我构建了一个程序,该程序检查两个不同数组中是否存在两个公共数字,然后记录这些数字。我能够使用一个简单的for循环来做到这一点,该循环通过第一个数组的每个元素,并检查第二个数组中是否有相等的元素。数组中每个相同的元素都存储在名为“ commonNumbers”的第三个数组中,我在程序结尾处进行了记录。
const firstNumbers = [12, 45, 6, 78]
const secondNumbers = [6, 7, 12, 45]
let commonNumbers = []
for (let i = 0; i < firstNumbers.length; i++) {
for (let j = 0; j < secondNumbers.length; j++) {
if (firstNumbers[i] === secondNumbers[j]) {
commonNumbers += secondNumbers[j]
}
} }
console.log(commonNumbers)
此示例的结果是以下内容:
12456
[Finished in 0.2s]
我的问题是关于结果。我可以看到程序实际上在数组(12、45、6)中运行并记录了相同的元素,但是我无法弄清楚为什么“ commonNumbers”以这样的方式存储结果,即数字之间没有空格。
我想清楚地看到每个数字。
例如,如果我调用“ commonNumbers”的第一个元素(索引为0):
commonNumbers[0]
我将得到的结果不是预期的“ 12”,而是“ 1”。
如果我说:commonNumbers[2]
,也会发生同样的事情。结果将是“ 4”,而不是“ 6”。
显然“ commonNumbers”数组以我期望的不同方式存储了元素。如何使用这种“存储”方法解决此问题?
答案 0 :(得分:2)
这是因为+=
在您的数组上隐式转换为字符串,如下面的示例所示,其中 Number 是总计为 Array 。
console.log(typeof([] + 1));
只需使用舒适的.push
(read more about push here)数组方法即可添加元素:
const firstNumbers = [12, 45, 6, 78]
const secondNumbers = [6, 7, 12, 45]
let commonNumbers = []
for (let i = 0; i < firstNumbers.length; i++) {
for (let j = 0; j < secondNumbers.length; j++) {
if (firstNumbers[i] === secondNumbers[j]) {
commonNumbers.push(secondNumbers[j]);
}
} }
console.log(commonNumbers)
(最后)请注意,还有其他几种方法可以完成任务,最明智的选择是filter
。您可能还需要注意最终的重复项,因为如果您的输入数组具有两个相同的数字,则commonsNumber结果将包含这两个数字,这可能是意外的。
试图同时处理重复项并循环较短数组的“确定性”聪明解决方案将是这样的:
// Inputs with duplicates, and longer array on second case.
const firstNumbers = [12, 45, 6, 78, 12, 12, 6, 45];
const secondNumbers = [6, 7, 12, 45, 45, 45, 12, 6, 99, 19, 5912, 9419, 1, 4, 8, 6, 52, 45];
// Performance: look for duplicates starting from the shortest array. Also, make a set to remove duplicate items.
const [shortestArray, longestArray] = firstNumbers.length < secondNumbers.length ? [firstNumbers, secondNumbers] : [secondNumbers, firstNumbers];
// Remove duplicates.
const dedupes = [...new Set(shortestArray)];
// Find commomn items using filter.
const commons = dedupes.filter(i => longestArray.indexOf(i) > -1);
console.log('commons is', commons);
别误会我,解决方案很好,只是想在样板中添加“内容”,以照顾最终的其他情况。
答案 1 :(得分:0)
const firstNumbers = [12, 45, 6, 78]
const secondNumbers = [6, 7, 12, 45]
let commonNumbers = []
for (let i = 0; i < firstNumbers.length; i++) {
for (let j = 0; j < secondNumbers.length; j++) {
if (firstNumbers[i] === secondNumbers[j]) {
commonNumbers.push(secondNumbers[j])
}
} }
push方法将值附加到数组。
答案 2 :(得分:0)
您似乎正在寻找array.prototype.push
(mdn)。例如:
const firstNumbers = [12, 45, 6, 78]
const secondNumbers = [6, 7, 12, 45]
let commonNumbers = []
for (let i = 0; i < firstNumbers.length; i++)
for (let j = 0; j < secondNumbers.length; j++)
if (firstNumbers[i] === secondNumbers[j])
commonNumbers.push(secondNumbers[j]);
console.log(commonNumbers); // as an array
console.log(commonNumbers.join(', '));
为什么“ commonNumbers”以这样的方式存储结果,即数字之间没有空格。
+
运算符将尝试将其操作数强制转换为兼容类型。在这种情况下,这是一个字符串,其中空数组[]
被强制转换为空字符串''
,数字3
被强制转换为相应的字符串'3'
。例如。 [] + 3
是字符串'3'
。
console.log([], typeof []);
console.log(3, typeof 3);
console.log([] + 3, typeof ([] + 3));