【问题标题】:Javascript convert array with null value to stringJavascript将具有空值的数组转换为字符串
【发布时间】:2019-04-04 13:18:35
【问题描述】:

我有数组

localCostp:
  0:null
  1:null
  2:0.5
  3:null
  4:null
  5:null
  6:0.5
  7:null
  8:null

我想把它转换成如下的字符串

"[],[],[0.5],[],[],[],[0.5],[],[]"

我已经尝试了以下

console.log("[" + Object.values(localCostp).join("],[") + "]");

但我失去了空值

"[0.5],[0.5]"

我用下面的代码填充数组

    Array.prototype.shuffle = function() {
       var r=[],c = this.slice(0);
        for (let i = c.length - 1; i > 0; i--) {
            const j = Math.floor(Math.random() * (i + 1));
            [c[i], c[j]] = [c[j], c[i]];
        }
        return c;
    }; 

    Array.prototype.populateUnique = function(n) {
    return Object.keys( Object( 0+Array(n) ) );
    };

    var getRandomInts = function(num, min, max) {
        var a = [].populateUnique(max+1).slice(min);
        a = a.shuffle();
        return a.slice(0,num);
    };

    BordsIdtoFill  = getRandomInts(NumOfBoardToFill,1,6);

       switch(retrivePanelsPanelsbetType(configGenerateData.panelsBetType)) {
    case 1: case 2:{   
        gameMultiplayer      = 1;
    } break;
    case 3: case 4 : case 5: {
       gameMultiplayer      = 2;    
    } break;
    case 6:  {            
        gameMultiplayer      = 2;
    } break;
}

var localCostp = new Array(9);

    BordsIdtoFill.forEach(function(Bord) {
      localCostp[Bord]= (1*gameMultiplayer * 0.5)
    });

console.log("[" + Object.values(localCostp).join("],[") + "]");

并非所有数组位置都被填满

【问题讨论】:

标签: javascript


【解决方案1】:

天真的做法是

const arr = [null, null, 0.5, null, 0.5]

const processedArr = arr.map(element => {
  if (element) {
    return [element];
  } else {
    return [];
  }
});

const result = JSON.stringify(processedArr);
console.log(result)

一种更短但可读性较差的方法是使用以下方法:

const arr = [null, null, 0.5, null, 0.5];
const result = `[[${arr.join('],[')}]]`;
console.log(result);

【讨论】:

  • 如果我使用你的代码和你的数组初始化都可以正常工作,但是如果我以编程方式初始化和填充数组,我会采用以下 null,[0.5],[0.5],[0.5],[0.5] ,[0.5],[0.5],null,null 我用下面的代码填充数组 var localCostp = new Array(9); BordsIdtoFill.forEach(function(Bord) { localCostp[Bord]= (1*gameMultiplayer * 0.5) });并非所有数组位置都被填充
  • 对不起,ermm.. 让我尝试运行您提供的代码。同时,我提供了另一种解决方案,它更短、更快,但可读性较差。
  • gameMultiplayer 任何整数吗?
【解决方案2】:

这是有趣的输出。 :-)

在你说过的评论中:

我用下面的代码填充数组

var localCostp = new Array(9);
BordsIdtoFill.forEach(function(Bord) {
    localCostp[Bord] = (1*gameMultiplayer * 0.5);
});

并非所有数组位置都被填满

这与您展示的数组非常不同。您显示的数组中有nulls。该数组中有 gap。当您读取间隙值时,您会返回 undefined(而不是 null)。

要做到这一点,您要么想要使用简单的for 循环、for-of 循环或使用来自values 的可迭代对象(包括间隙)的其他方式,要么先填补空白。

例如,这使用来自values 的迭代:

const string = [...localCostp.values()].map(entry => JSON.stringify(entry === undefined ? [] : [entry])).join();

现场示例:

const localCostp = new Array(9);
localCostp[2] = 0.5;
localCostp[6] = 0.5;

const string = [...localCostp.values()].map(entry => JSON.stringify(entry === undefined ? [] : [entry])).join();
console.log(string);

在你说的另一条评论中:

如果我在我的环境中运行你的代码,我会在评估预请求脚本时出错:TypeError: localCostp.values(...)[Symbol.iterator] is not a function

令人惊讶的是,values 是在 ES2015 中添加的,同时 Symbol.iterator 和 array spread 也是如此,但是您的错误消息使您看起来好像拥有后者而不是前者。我怀疑你正在编译并错过了一个 polyfill。

这是一个 ES5 版本(不能使用map,因为它不会访问间隙):

var result = [];
for (var i = 0; i < localCostp.length; ++i) {
    var entry = localCostp[i];
    result[i] = JSON.stringify(entry === undefined ? [] : [entry]);
}
result = result.join();

现场示例:

var localCostp = new Array(9);
localCostp[2] = 0.5;
localCostp[6] = 0.5;

var result = [];
for (var i = 0; i < localCostp.length; ++i) {
    var entry = localCostp[i];
    result[i] = JSON.stringify(entry === undefined ? [] : [entry]);
}
result = result.join();

console.log(result);

【讨论】:

  • 如果我使用你的代码和你的数组初始化都可以正常工作,但是如果我以编程方式初始化和填充数组,我会采用以下 null,[0.5],[0.5],[0.5],[0.5] ,[0.5],[0.5],null,null 我用下面的代码填充数组 var localCostp = new Array(9); BordsIdtoFill.forEach(function(Bord) { localCostp[Bord]= (1*gameMultiplayer * 0.5) });并非所有数组位置都被填充
  • @LucaRuggeri - 这不是带有nulls 的数组,而是带有间隙 的数组。读取间隙会给你价值undefined(不是null)。为什么不首先向我们展示您是如何创建它的?
  • 使用创建和填充数组的代码编辑我的帖子
  • 对不起,但是当我 console.log 数组时,我取空值...... localCostp.values(...)[Symbol.iterator] 不是函数
  • @LucaRuggeri - 令人惊讶的是,values 是在 ES2015 中添加的,与 Symbol.iterator 是同一时间,但是您的错误消息使您看起来好像拥有后者而不是前者。您是否正在使用转译并缺少 polyfill?我将添加一个 ES5 解决方案。
【解决方案3】:

您可以只使用Array#map 生成[]null 值或将数字括在方括号中,然后Array#join 以获得所需的输出:

let arr = [
  null,
  null,
  0.5,
  null,
  null,
  null,
  0.5,
  null,
  null
]

let str = arr
  .map(item => item === null ? "[]" : `[${item}]`)
  .join();

console.log(str);

【讨论】:

  • 如果我使用你的代码和你的数组初始化都可以正常工作,但是如果我以编程方式初始化和填充数组,我会采用以下 null,[0.5],[0.5],[0.5],[0.5] ,[0.5],[0.5],null,null 我用下面的代码填充数组 var localCostp = new Array(9); BordsIdtoFill.forEach(function(Bord) { localCostp[Bord]= (1*gameMultiplayer * 0.5) });并非所有数组位置都被填充
【解决方案4】:

您可以映射或不映射数组中的值并将数据字符串化并获取外括号之间的字符串。

var data = [null, null, 0.5, null, null, null, 0.5, null, null],
    result = JSON.stringify(data.map(v => v === null ? [] : [v])).slice(1, -1);

console.log(result);

带有模板字符串的示例。

var data = [null, null, 0.5, null, null, null, 0.5, null, null],
    result = data.map(v => `[${v === null ? '' : v}]`).join();

console.log(result);

带有稀疏项目的数组。

var array = [, , 0.5, , , , 0.5, , ],
    result = Array.from(array, (v = '') => `[${v}]`).join();

console.log(result);

【讨论】:

  • 如果我使用你的代码和你的数组初始化都可以正常工作,但是如果我以编程方式初始化和填充数组,我会采用以下 null,[0.5],[0.5],[0.5],[0.5] ,[0.5],[0.5],null,null 我用下面的代码填充数组 var localCostp = new Array(9); BordsIdtoFill.forEach(function(Bord) { localCostp[Bord]= (1*gameMultiplayer * 0.5) });并非所有数组位置都被填充
猜你喜欢
  • 2022-01-23
  • 2021-02-08
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
相关资源
最近更新 更多