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)
谢谢
您可以借助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)