在javascript中将嵌套对象转换为上一级对象

时间:2018-12-21 02:18:53

标签: javascript node.js

给出json:-

{
    "_id": "5c1c4b2defb4ab11f801f30d",
    "name": "Ray15",
    "email": "ray15@gmail.com",
    "deviceToken": "dgtssgeegwes",
    "deviceType": "IOS",
    "tokens": [
        {
            "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1YzFjNGIyZGVmYjRhYjExZjgwMWYzMGQiLCJhY2Nlc3MiOiJhdXRoIiwiaWF0IjoxNTQ1MzU4MTI2fQ.YdK0MjOm7Lff22uTFITQdic0gKdMZRpsmRee-yejDpQ"
        }
    ]
}

所需的json:-

{
  "_id": "5c1c4b2defb4ab11f801f30d",
  "name": "Ray15",
  "email": "ray15@gmail.com",
  "deviceToken": "dgtssgeegwes",
  "deviceType": "IOS",
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1YzFjNGIyZGVmYjRhYjExZjgwMWYzMGQiLCJhY2Nlc3MiOiJhdXRoIiwiaWF0IjoxNTQ1MzU4MTI2fQ.YdK0MjOm7Lff22uTFITQdic0gKdMZRpsmRee-yejDpQ"
}

我想借助javascript中npm的lodash库转换JSON或建议其他库,

这可能是一个愚蠢的问题,请正确解释,我是JavaScript的新手,请尝试学习node.js。如果需要更多说明,请评论我。

感谢帮助

3 个答案:

答案 0 :(得分:1)

您实际上并不需要库,您只需分配属性并删除另一个即可。

但是tokens是一个数组,这表明可能存在多个数组。这只会采用第一个(obj.tokens[0].token)。由于对象不能有重复的键,因此您只能使用一个具有所需格式的令牌(如果有的话)。

let obj = {
    "_id": "5c1c4b2defb4ab11f801f30d",
    "name": "Ray15",
    "email": "ray15@gmail.com",
    "deviceToken": "dgtssgeegwes",
    "deviceType": "IOS",
    "tokens": [
        {
            "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1YzFjNGIyZGVmYjRhYjExZjgwMWYzMGQiLCJhY2Nlc3MiOiJhdXRoIiwiaWF0IjoxNTQ1MzU4MTI2fQ.YdK0MjOm7Lff22uTFITQdic0gKdMZRpsmRee-yejDpQ"
        }
    ]
}

obj.token = obj.tokens[0].token 
delete obj.tokens
console.log(obj)

答案 1 :(得分:0)

使用带有类型的“空”表示形式的解构分配效果很好。当transform包含零个,一个或多个tokens值时,{ token: ... }产生可靠的输出。

const emptyUser =
  { _id: 0, name: "", tokens: [] }
  
const emptyToken =
  { token: "" }

const toSingleTokenUser =
  ({ tokens: [ { token } = emptyToken ], ...u } = emptyUser) =>
    ({ ...u, token })

console .log
  ( toSingleTokenUser ({ _id: 1, name: "a", tokens: [ { token: "t" } ] })
    // { _id: 1, name: "a", token: "t" }
    
  , toSingleTokenUser ({ _id: 1, name: "a", tokens: [] })
    // { _id: 1, name: "a", token: "" }
    
  , toSingleTokenUser ({ _id: 1, name: "a", tokens: [ { token: "t1" }, { token: "t2" } ] })
    // { _id: 1, name: "a", token: "t1" }

  , toSingleTokenUser ({ foo: "bar", tokens: [ { token: "t" } ] })
    // { foo: "bar", token: "t" }
  )

答案 2 :(得分:0)

有多种方法可以解决此问题,而没有一种“正确”的方法。但是,您可能要考虑创建一个新对象,而不是对原始对象进行突变。在JavaScript中,对象总是通过引用传递的,很容易意外地在函数内部修改对象,而没有意识到您只是在其他引用对象的地方也更改了该对象。

自从您提到它以来,这是使用Lodash解决此问题的一种方法。

const obj = {
    "_id": "5c1c4b2defb4ab11f801f30d",
    "name": "Ray15",
    "email": "ray15@gmail.com",
    "deviceToken": "dgtssgeegwes",
    "deviceType": "IOS",
    "tokens": [
        {
            "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1YzFjNGIyZGVmYjRhYjExZjgwMWYzMGQiLCJhY2Nlc3MiOiJhdXRoIiwiaWF0IjoxNTQ1MzU4MTI2fQ.YdK0MjOm7Lff22uTFITQdic0gKdMZRpsmRee-yejDpQ"
        }
    ]
};

// create a new object without the tokens property
const newObj = _.omit(obj, 'tokens');

// get the first token object from the tokens array
const tokenObj = _.head(obj.tokens);

// get the token string from the token object, defaulting to empty string if not found
newObj.token = _.get(tokenObj, 'token', '');

console.log(newObj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Lodash是一个很棒的库,被许多项目使用。这对新开发人员特别有用。例如,如果_.head(arr)未定义,undefined将返回arr。但是,arr[0]在相同情况下会崩溃。

这是一种无需库即可解决的方法。

const obj = {
    "_id": "5c1c4b2defb4ab11f801f30d",
    "name": "Ray15",
    "email": "ray15@gmail.com",
    "deviceToken": "dgtssgeegwes",
    "deviceType": "IOS",
    "tokens": [
        {
            "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1YzFjNGIyZGVmYjRhYjExZjgwMWYzMGQiLCJhY2Nlc3MiOiJhdXRoIiwiaWF0IjoxNTQ1MzU4MTI2fQ.YdK0MjOm7Lff22uTFITQdic0gKdMZRpsmRee-yejDpQ"
        }
    ]
};

// create a copy of the original object.
// note that Object.assign will make a shallow copy of our object,
// so newObj.tokens will be a pointer to obj.tokens.
// in this instance, we don't care, as we are going to remove newObj.tokens anyway.
const newObj = Object.assign({}, obj);

// throw away the tokens property.
// OK to mutate newObj as we know it is not used anywhere else.
delete newObj.tokens;

// get the first token object from the tokens array.
// the (expectedArray || []) pattern ensures we have an array if obj.tokens is null or undefined.
const tokenObj = (obj.tokens || [])[0];

// get the token string from the token object.
// again, using the (expectedObject || {}) pattern in case tokenObj is null or undefined.
const token = (tokenObj || {}).token;

// create a new property called "token" on our newObj object.
// set it to our token value or an empty string if token is null or undefined.
newObj.token = token || '';

// of course, if you know the tokens array will always have a valid token object,
// you can simply use newObj.token = obj.tokens[0].token.

console.log(newObj);