首页 > 解决方案 > 使用 Slice 或 Push 将值推送到数组中仍然返回 Undefined

问题描述

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

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

仔细阅读后,似乎需要首先初始化数组以防止未定义的实例,但无论如何它都会将未定义推送到每个数组值中。

这是我的代码:

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"]
}

所以我的主要问题是:为什么未定义被推入每个数组值?为什么也没有任何破折号被推入?

我已经尝试使用同样返回未定义的切片,并使用不做任何事情的普通 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]);
        }

    }
}

这里的原理不一样吗?我觉得有什么我不明白的。感谢您在这里的任何帮助。

标签: javascript

解决方案


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函数,如果要组合mapand filter,则应检查该reduce函数。


推荐阅读