检查密钥是否存在

时间:2018-11-01 12:07:59

标签: javascript

我有groupedTags,我需要向其中添加字段,并在整个字段中添加新标签。

let groupedTags = {
     'other': {}
}

if (!groupedTags.other[field]) {
    groupedTags.other[field] = [];
}
groupedTags.other[field].push(tag);

我了解有必要初始化一个新字段以推送新标签-是否有更漂亮的方法每次都检查一个字段是否存在?我的意思是避免显式检查。还是没有什么可怕的检查?在很多地方都可以重复

3 个答案:

答案 0 :(得分:0)

也许您应该使用Proxies进行调查,以获得所需的结果。

这是这样做的简短示例CodeSandbox -example

1)创建代理处理程序以自定义Object行为

const handler = {
  set: function(obj, key, value) {
    if (!obj[key]) {
      obj[key] = [];
    }

    obj[key].push(value);
    return true;
  }
};

2)将代理分配给您的对象

let groupedTags = {
  other: new Proxy({}, handler)
};

现在,分配新值将达到Proxy

groupedTags.other.b = "bar";
// {"other":{"b":["bar"]}}

答案 1 :(得分:-1)

如果要在空(或非空)对象上创建元素数组,则可以尝试此操作。因此,您不必检查要推送元素的属性是否已经存在。

如果不这样做,它将连接一个空数组,为您提供一个元素为1的数组,否则该值将添加到该数组中。希望这会有所帮助。

const o = {};

const toAdd = [1,2,3,4];

toAdd.forEach((v) => {
  o.other = (o.other || []).concat(v);
});

o.other2 = (o.other2 || []).concat(123);

console.log(o);

答案 2 :(得分:-1)

我认为,除了需要自己明确地进行设置之外,没有其他方法可以检查是否需要将值+初始化。

您可以像这样使用 .then((response) => { this.posts = response.data; this.configPagination(response.headers); }) 取出groupedTags.other[field]的一次出现:

||

您还可以使用封装了check-and-init部分的辅助方法:

let field = "foo", tag = "bar";
let groupedTags = {
  'other': {}
}

// Get the existing items, or assign a new list & use it:
var items = groupedTags.other[field] || (groupedTags.other[field] = []);
items.push(tag);

console.log(groupedTags);