【问题标题】:How to handle Javascript empty object?如何处理 Javascript 空对象?
【发布时间】:2016-01-16 13:03:37
【问题描述】:

我被难住了。

这是代码:

const clientInfoPromise = buildPromiseMethod
clientInfoPromise.then((clients) => {
    console.log('clients ' + JSON.stringify(clients))
    console.log(clients.typeOf)
    console.log(_.keys(clients))

这是输出:

clients {}
undefined
['undefined']

我希望 _.keys(clients) 返回一个空数组,而不是带有字符串“未定义”的数组。 _.isEmpty(clients) ? [] : _.keys(clients) 不起作用,因为 _.isEmpty 返回 false

ClientInfoPromise 在这里定义:

static buildPromiseMethod(cids) {
    if (condition) {
        // fetch data
        const data = [data,data1,data2]
        return Promise.resolve(_.zipObject(cids, data));
    } else {
      const clients = _(cids)
        .indexBy()
        .mapValues(() => {
          return undefined; //contains empty data
        })
        .value();
      return Promise.resolve(clients);
    }
  }

cids 可以是 undefined[][1,2,3](数字数组)。

【问题讨论】:

  • 看起来您缺少第一个代码块末尾的右花括号和括号。
  • 嗯? _.keys(undefined).length === 0
  • 如果这些答案对您有帮助,请接受其中一个。

标签: javascript ecmascript-6 lodash


【解决方案1】:

console.log(clients.typeOf)

要记录clients 的类型,请使用console.log(typeof clients)

console.log(_.keys(clients))

_.key 报告clients 有一个名为"undefined" 的键。很可能,stringify 没有显示此键值对,因为它的值也未定义,这意味着它将被 stringify 跳过。

为了验证这一点,而不是

console.log('clients' + JSON.stringify(clients))

使用

console.log('clients', clients)

这将向您显示所有属性,包括stringify 将跳过的属性,因为它们的值未定义。

在您的特定情况下,您报告的行为最好用buildPromiseMethod 中的错误来解释,即它返回的承诺被解析为一个对象,该对象具有单个键“undefined”,并且具有不可序列化的值。例如,请考虑以下几点:

> clients = { undefined: undefined };
> console.log('clients ' + JSON.stringify(clients))
< clients {}

> console.log(_.keys(clients))
< ['undefined']

这正是你得到的。

然而,buildPromiseMethod 如何返回这样一个格式错误的对象并不明显。最有可能的罪魁祸首是zipObject。这真的是您正在运行的确切源代码吗?例如,_.zipObject([cids], data)(将 cids 指定为数组,当它的值未定义时,而 data 还包含未定义的值)可能会导致报告的行为:

var data, data1, data2;       // values are undefined
data = [data, data1, data2];
var cids = undefined;
_.zipObject([cids], data);

> { undefined: undefined }

顺便说一句,您对 Promise 的使用很可能是错误的,至少假设 // fetch data 是异步的。你可能想要

static buildPromiseMethod(cids) {
  if (condition) {
    return fetchdata().then(data => 
      _.zipObject(cids, data));
  }

或类似的东西。这可能与您的问题有关,如果 data1 等从 Promise 中返回,并且您尝试在 Promise 完成之前访问它,在这种情况下,它的值将是未定义的。

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2014-05-12
    • 2014-08-22
    相关资源
    最近更新 更多