javascript - JSON 未定义属性 - 简化验证以避免类型错误

标签 javascript json properties undefined simplify

我正在尝试有效地验证多层 json 对象,这些对象可能具有一个或多个未定义的父属性,具体取决于场景。

这是一个对象只有 2 级属性的示例:

scenarioArray = [ 
{color:{blue:'yes'}},
{color:{green:'no'}},
{colour:{blue:'yes'}} ]; //colour instead of color

所以我想最有效地识别场景的颜色

let color;
let s = randomScenario; //random scenario from the scenarioArray
if(s.color != undefined && s.color.blue != undefined) {
    color = s.color.blue;
} else if (s.color != undefined && s.color.green != undefined) {
    color = s.color.green;
} else if (s.colour != undefined && s.colour.blue !=undefined) {
    color = s.colour.blue;
};

这段代码在技术上是可行的,只是有点乱。

当您将其外推到具有 4-5 级属性的对象时,if 语句变得笨拙且不可读。

我很乐意就如何简化这一点提出建议。

真实世界的 json 对象示例:

addendum.contract.buyerInformation.name 
addendum.contract.contract.buyerInformation.name
addendum.contract.purchaser.buyerFirstName
addendum.contract.data.purchaser.buyer.name

使用的框架/库: AngularJS Lodash (对任何可以提高效率的建议库开放)

附言如果这对 stackOverflow 来说太开放了,请告诉我...

最佳答案

不幸的是,JavaScript 缺少原生 autovivification , 但它可以通过 Proxy 模拟在某种程度上。

这是一个笨拙且脆弱的解决方案,但它将任何深度检查减少为两个操作并且应该适用于大多数情况:

'use strict';

const isEmpty = Symbol('isEmpty');

function autoVivify(object = {}) {
  Object.defineProperty(object, isEmpty, {
    get: () => Object.keys(object).length === 0,
  });

  Object.keys(object).forEach((key) => {
    const val = object[key];
    if (typeof val === 'object' && val !== null) object[key] = autoVivify(val);
  });

  return new Proxy(
    object,
    { get: (obj, name) => name in obj ? obj[name] : obj[name] = autoVivify() },
  );
}

const scenarioArray = [
    { color: { blue: 'yes' }},
    { color: { green: 'no' }},
    { colour: { blue: 'yes' }},
];

const randomScenario = autoVivify(scenarioArray[0]);

if (randomScenario.color.blue && !randomScenario.color.blue[isEmpty])
  console.log(randomScenario.color.blue);

if (randomScenario.color.red && !randomScenario.color.red[isEmpty])
  console.log(randomScenario.color.red);

if (randomScenario.color.a.b.c && !randomScenario.color.a.b.c[isEmpty])
  console.log(randomScenario.color.a.b.c);

if (randomScenario.colour.green && !randomScenario.colour.green[isEmpty])
  console.log(randomScenario.colour.blue);

希望我们能有a more appropriate way很快。

关于javascript - JSON 未定义属性 - 简化验证以避免类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54581492/

相关文章:

javascript - 在 webpack 中包含第三方库

javascript - Fb Like 按钮 + <http ://www. facebook.com> 获取属性 Proxy.InstallTrigger 的权限被拒绝

objective-c - Objective-C 中的单例属性访问

java - 如何在不调用其绝对路径的情况下读取 .properties 文件

java - 在另一个项目的属性文件中引用另一个项目的目录

javascript - 使用构造函数创建对象并使用 javascript 返回完成的对象的函数

javascript - JavaScript .apply 方法如何工作?

php - jQuery/JSON/PHP 失败

javascript - 如何使用 JSON 并通过 D3 返回数据

javascript - 我如何在 Firebase Angularjs 中使用 $id 作为数字或新变量?