最优雅的方式来创建一个JSON对象

时间:2017-09-24 20:25:21

标签: javascript json

我有一个看起来像这样的javacript对象。

class MyLinkedList
{
    int size = 0;

    public void add(float x)
    {
        size++;
        ....
    }

    public void remove(float x)
    {
        size--;
        ...
    }

    public int size()
    {
        return size;
    }

我想将此转换为嵌套的json,如此

val = 
{
default: "version1"
version1: "abc.com"
version2: "def.com"
...
versionn:"xyz.com"
}

}

如果if语句和不必要的变量,我的版本会使用很多。有没有一种优雅的方式来转换/创建这个JSON。

,默认版本是newval.website下的版本,所有版本数据都是值new newval.website.versions

5 个答案:

答案 0 :(得分:8)

设置.website属性非常简单。只需查找default持有的密钥即可。

另一部分可以通过过滤掉default密钥,然后将其余部分映射到使用Object.assign分配给结果的新对象列表来完成。



var val =  {
default: "version1",
version1: "abc.com",
version2: "def.com",
version3:"xyz.com"
};

var res = {
  website: {url: val[val.default]},
  versions: Object.assign(
    ...Object.keys(val)
             .filter(k => k !== "default")
             .map(k => ({[k]: {website: {url: val[k]} } }))
)};

console.log(res);




这是避免需要.filter()的另一种方法。它假设您不介意在原始对象上使default不可枚举。



var val =  {
default: "version1",
version1: "abc.com",
version2: "def.com",
version3:"xyz.com"
};

var res = {
  website: {url: val[Object.defineProperty(val, "default", {enumerable:false}).default]},
  versions: Object.assign(
    ...Object.keys(val).map(k => ({[k]: {website: {url: val[k]} } }))
)};

console.log(res);




该属性仍然是可配置的,因此您可以根据需要重置它。

或在.entries()回调中使用.keys()代替.map()参数解构。



var val =  {
default: "version1",
version1: "abc.com",
version2: "def.com",
version3:"xyz.com"
};

var res = {
  website: {url: val[Object.defineProperty(val, "default", {enumerable:false}).default]},
  versions: Object.assign(
    ...Object.entries(val).map(([k, v]) => ({[k]: {website: {url: v} } }))
)};

console.log(res);




答案 1 :(得分:2)

我的版本:

var val = {
  default: 'version1',
  version1: 'abc.com',
  version2: 'def.com',
  version3: 'xyz.com'
}

var res = {
  website: {url: val[val.default]},
  versions: Object.entries(val).reduce(function(a, [k, v]) {
    if (k != 'default') a[k] = {website: {url: v}}
    return a
  }, {})
}

console.log(res)

答案 2 :(得分:2)

这是我的版本,只是将条目直接缩减到websites属性,不包括default属性



var val = {
  default: "version1",
  version1: "abc.com",
  version2: "def.com",
  versionn: "xyz.com"
}

var result = {
  newval   : {website : val.default},
  versions : Object.entries(val).reduce((a,b)=>((b[0] != 'default'?a[b[0]]={website:b[1]}:0),a),{})
};

console.log(result)




答案 3 :(得分:1)

您可以通过迭代键并分配给对象来直接为默认值分配零件。



var values = { default: "version1", version1: "abc.com", version2: "def.com", versionn: "xyz.com" },
    result = {
        newval: {
            website: { url: values[values.default] },
            versions: Object.assign(...Object.keys(values).map(k => k === 'default'
                ? {}
                : { [k]: { website: { url: values[k] } } }))
        }
    };


console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }




答案 4 :(得分:1)

在没有函数调用的情况下更高效和兼容:

val = { default:"version1", version1:"abc.com", version2:"def.com", versionn:"xyz.com" }

newval = { website: { url: val[val.default] }, versions: { } }

for (k in val)
  if (k !== 'default')
    newval.versions[k] = { website: { url: val[k] } }

console.log({newval})