将对象转换为JSON并删除键

kat*_*son 4 javascript arrays object

我在尝试使用现有对象创建新数组时遇到了一些困难。如果我执行以下操作

console.log(JSON.stringify(this.data))
Run Code Online (Sandbox Code Playgroud)

输出是这样的

{
    "nodes":[
        {"id":1,"node":"0","name":"pizza","created_at":"2019-09-01 09:56:01","updated_at":"2019-09-01 09:56:01"},
        {"id":2,"node":"1","name":"pasta","created_at":"2019-09-01 09:56:01","updated_at":"2019-09-01 09:56:01"},
        {"id":3,"node":"2","name":"pie","created_at":"2019-09-01 09:56:01","updated_at":"2019-09-01 09:56:01"}
    ],
    "links":[
        {"id":1,"source":"0","target":"1","value":"451","created_at":"2019-09-01 09:56:01","updated_at":"2019-09-01 09:56:01"},
        {"id":2,"source":"1","target":"3","value":"237","created_at":"2019-09-01 09:56:01","updated_at":"2019-09-01 09:56:01"}
    ]
}
Run Code Online (Sandbox Code Playgroud)

我想做的是从节点中删除所有不是节点或名称的内容。从链接中,除去源,目标和价值之外的所有内容。我一直在尝试以下类似的事情,但没有成功

const valuesToRemove = ['id', 'created_at', 'updated_at'];
this.data.links = this.data.links.filter((i) => (valuesToRemove.indexOf(i) === -1));
Run Code Online (Sandbox Code Playgroud)

那么我该如何将以上内容变成这样呢?

{
    "nodes":[
        {"node":"0","name":"pizza"},
        {"node":"1","name":"pasta"},
        {"node":"2","name":"pie"}
    ],
    "links":[
        {"source":"0","target":"1","value":"451"},
        {"source":"1","target":"3","value":"237"}
    ]
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Ful*_*Guy 5

您可以借助Array.prototype.map来映射数组属性,并仅在对象中保留必需的键:

const data = {
    "nodes":[
        {"id":1,"node":"0","name":"pizza","created_at":"2019-09-01 09:56:01","updated_at":"2019-09-01 09:56:01"},
        {"id":2,"node":"1","name":"pasta","created_at":"2019-09-01 09:56:01","updated_at":"2019-09-01 09:56:01"},
        {"id":3,"node":"2","name":"pie","created_at":"2019-09-01 09:56:01","updated_at":"2019-09-01 09:56:01"}
    ],
    "links":[
        {"id":1,"source":"0","target":"1","value":"451","created_at":"2019-09-01 09:56:01","updated_at":"2019-09-01 09:56:01"},
        {"id":2,"source":"1","target":"3","value":"237","created_at":"2019-09-01 09:56:01","updated_at":"2019-09-01 09:56:01"}
    ]
};
function transform(data){
    data.nodes = data.nodes.map(({node, name}) => ({node, name}));
    data.links = data.links.map(({source, target, value}) => ({source, target, value}));
    return data;
}
console.log(transform(data));
Run Code Online (Sandbox Code Playgroud)

一种更动态的方法,而不是硬编码要保留的道具,而是将其作为ES6提供Set(以加快查找速度)并将节点映射为正确的形式:

const data = {
    "nodes":[
        {"id":1,"node":"0","name":"pizza","created_at":"2019-09-01 09:56:01","updated_at":"2019-09-01 09:56:01"},
        {"id":2,"node":"1","name":"pasta","created_at":"2019-09-01 09:56:01","updated_at":"2019-09-01 09:56:01"},
        {"id":3,"node":"2","name":"pie","created_at":"2019-09-01 09:56:01","updated_at":"2019-09-01 09:56:01"}
    ],
    "links":[
        {"id":1,"source":"0","target":"1","value":"451","created_at":"2019-09-01 09:56:01","updated_at":"2019-09-01 09:56:01"},
        {"id":2,"source":"1","target":"3","value":"237","created_at":"2019-09-01 09:56:01","updated_at":"2019-09-01 09:56:01"}
    ]
};

function transformDynamic(data, nodesToKeep, linksToKeep){
    data.nodes = data.nodes.map((ele) => {
       return Object.keys(ele).reduce((acc,key) => {
           if(nodesToKeep.has(key)){
              acc[key] = ele[key];           
           }
           return acc;
        }, {}); 
      })
    data.links =data.links.map((ele) => {
       return Object.keys(ele).reduce((acc,key) => {
           if(linksToKeep.has(key)){
              acc[key] = ele[key];           
           }
           return acc;
        }, {}); 
      });
    return data;
}
const nodesToKeep =  new Set(["node", "name"]);
const linksToKeep =  new Set(["ource", "target", "value"]);
console.log(transformDynamic(data, nodesToKeep, linksToKeep));
Run Code Online (Sandbox Code Playgroud)