使用Slice或Push将值推入数组仍返回未定义

时间:2018-11-25 14:16:32

标签: javascript

我试图弄清楚如何将值简单地推入数组中,并且在这里努力取得任何进展。我正在尝试创建一个简单的函数,在其中输入一串数字,并在每个奇数之间返回破折号-因此:

oddDash(11146); // should return 1-1-146
oddDash(24662); // should return 24662
oddDash(9899); // should return 989-9

已经阅读了一下,似乎需要首先初始化数组以防止出现未定义的实例,但是无论如何它都会将undefined推入每个数组值中。

这是我的代码:

function oddDash(n) { // e.g. var n = 11146;

    var arr = (""+n).split(""); // ["1", "1", "1", "4", "6"]
    var result = []; // initialisation

    result = arr.map(function(c,i,a) {
        if (c % 2 != 0 && a[i+1] % 2 != 0) { // if this & next values are odd
            result.push(c);
            result.push('-');
        } else {
            result.push(c);
        }
    }); // should return ["1", "-", "1", "-", "1", "-", "4", "6"]
}

所以我的主要问题是:为什么将undefined推入每个数组值?为什么不插入任何破折号?

我尝试过使用slice(它也返回未定义)和普通的for循环进行重试。

出于好奇,有人可以解释以下内容为何起作用:

// NO ERROR
var arr = ["1", "2", "3", "4", "5", "6", "7", "8", "9"];
var result = arr.map(function(c,i,a) {
    console.log(c);
});

但是下面的三个不起作用:

// FAILS
var arr = ["1", "2", "3", "4", "5", "6", "7", "8", "9"];
var result = arr.map(function(c,i,a) {
    result.slice(c);
});

// FAILS
why doesht this work>?
var arr = ["1", "2", "3", "4", "5", "6", "7", "8", "9"];
var result = arr.map(function(c,i,a) {
    result.push(c);
});

// DOES NOTHING
function oddDash(n) { // e.g. var n = 11146;

    var arr = (""+n).split(""); // ["1", "1", "1", "4", "6"]
    var result = []; // initialisation

    for (k = 0; k > arr.length; k++) {

        if (arr[k] % 2 != 0 && arr[k+1] % 2 != 0) {
            result.push(arr[k]);
            result.push('-');
        } else {
            result.push(arr[k]);
        }

    }
}

这里的原理不一样吗?我觉得有些事情我不了解。感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

map函数遍历一个集合,并返回一个新的集合,其中每个元素都用其对应的返回值替换。这意味着,如果您在回调函数中未返回任何内容,则数组将以undefined作为值填充。

例如:

// new array will equal [2,3,4]
const array = [1,2,3].map(element => element + 1);

// but... new array will equal [undefined, undefined, undefined]
const array = [1,2,3].map(element => console.log(element));

即使将值推送到新数组,您仍要为其分配映射数组的值,该数组又将undefined填充为值,因此这就是数组的最终值。 因此,请尝试返回所需的值,而不是将其推入新数组。

如果要删除特定元素,则应使用filter函数,并且如果要合并mapfilter,则应签出reduce函数