微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

删除数组内JSON平面对象中的前两个字符

如何解决删除数组内JSON平面对象中的前两个字符

我有这个带有1个对象的JSON平面数组:

const jsonFile = [ { "0.id": 1,"0.details.first_name": "Gary","0.details.last_name": "Ortiz","0.details.nicknames.0.language": "italian","0.details.nicknames.0.value": "martello","0.details.nicknames.1.language": "inglese","0.details.nicknames.1.value": "hammer","0.details.email.0": "gortiz0@mapy.cz","0.details.email.1": "awilliamson1@narod.ru","0.country": "Indonesia","0.modified": "2015-05-16","0.vip": false,"1.id": 2,"1.details.first_name": "Carl","1.details.last_name": "Jones","1.details.nicknames.0.language": "danish","1.details.nicknames.0.value": "wefwgge","1.details.nicknames.1.language": "Doich","1.details.nicknames.1.value": "egwrgerge","1.details.email.0": "erkhoej@google.net","1.details.email.1": "peeeeeeeeeeweqw@fb.ru","1.country": "Taiwan","1.modified": "2325-05-16","1.vip": false,"2.id": 3,"2.details.first_name": "Michael","2.details.last_name": "Smith","2.details.nicknames.0.language": "Portoguese","2.details.nicknames.0.value": "wdqppppd","2.details.nicknames.1.language": "Russian","2.details.nicknames.1.value": "hamfwewdqqmer","2.details.email.0": "dcwrverg3@iissq.fr","2.details.email.1": "vvnvncmmxm@dqwdq.com","2.country": "Japan","2.modified": "1235-44-44","2.vip": true } ] 

// I've flatted this object using this function: 

JSON.flatten = function(data) {
    var result = {};
    function recurse (cur,prop) {
        if (Object(cur) !== cur) {
            result[prop] = cur;
        } else if (Array.isArray(cur)) {
             for(var i=0,l=cur.length; i<l; i++)
                 recurse(cur[i],prop ? prop+""+i : ""+i);
            if (l == 0)
                result[prop] = [];
        } else {
            var isEmpty = true;
            for (var p in cur) {
                isEmpty = false;
                recurse(cur[p],prop ? prop+""+p : p);
                
            }
            if (isEmpty)
                result[prop] = {};
        }
    }
    recurse(data,"");
    return result;
}

let finalFlat = JSON.flatten(jsonFile)

console.log(finalFlat)

我需要删除对象每个元素的前两个字符。

例如,这个:

"0.id": 1,

需要成为这个:

"id": 1,"details.first_name": "Gary","details.last_name": "Ortiz",

有人对如何执行此操作有想法吗?我已经尝试了拼接和映射,但是它们不起作用,因为它是对象而不是数组。

解决方法

如果您知道数组只有一个元素,则不需要flatten函数,您可以仅获取第一个也是唯一的元素。然后,使用修改后的键将值分配给新对象:

var data = [
  {
    "0.id": 1,"0.details.first_name": "Gary","0.details.last_name": "Ortiz"
  }
];

var dataObject = data[0];
var result = {};
Object.entries(dataObject).forEach(entry => {
    var [key,value] = entry;
    var newKey = key.substring(2);
    result[newKey] = value;
});
console.log(result);

,
  • 使用Object.entries,可以从每个对象生成[键,值]对。
  • 使用Array.reduce,可以生成从键中获取2个字符的结果对象。

const input = [ { "0.id": 1,"0.details.last_name": "Ortiz","0.details.nicknames.0.language": "italian","0.details.nicknames.0.value": "martello","0.details.nicknames.1.language": "inglese","0.details.nicknames.1.value": "hammer","0.details.email.0": "gortiz0@mapy.cz","0.details.email.1": "awilliamson1@narod.ru","0.country": "Indonesia","0.modified": "2015-05-16","0.vip": false,"1.id": 2,"1.details.first_name": "Carl","1.details.last_name": "Jones","1.details.nicknames.0.language": "danish","1.details.nicknames.0.value": "wefwgge","1.details.nicknames.1.language": "Doich","1.details.nicknames.1.value": "egwrgerge","1.details.email.0": "erkhoej@google.net","1.details.email.1": "peeeeeeeeeeweqw@fb.ru","1.country": "Taiwan","1.modified": "2325-05-16","1.vip": false,"2.id": 3,"2.details.first_name": "Michael","2.details.last_name": "Smith","2.details.nicknames.0.language": "Portoguese","2.details.nicknames.0.value": "wdqppppd","2.details.nicknames.1.language": "Russian","2.details.nicknames.1.value": "hamfwewdqqmer","2.details.email.0": "dcwrverg3@iissq.fr","2.details.email.1": "vvnvncmmxm@dqwdq.com","2.country": "Japan","2.modified": "1235-44-44","2.vip": true } ] 

const result = input.map((item) => (Object.entries(item).reduce((acc,cur) => {
  const indexKey = cur[0].substring(0,2);
  if (!acc[indexKey]) { acc[indexKey] = {}; }
  acc[indexKey][cur[0].substring(2)] = cur[1];
  return acc;
},{}))).map((item) => Object.values(item)).flat();
console.log(result);

,

您可以根据值构建对象或数组。

const
    setValue = (object,path,value) => {
        let keys = path.split('.'),last = keys.pop();

        keys
            .reduce((o,k,i,kk) =>
                o[k] = o[k] || (isFinite(i + 1 in kk ? kk[i + 1] : last) ? [] : {}),object)
            [last] = value;
    },data = [{ "0.id": 1,"2.vip": true }],result = data.reduce((r,o) => {
        Object.entries(o).forEach(([k,v]) => setValue(r,v));
        return r;
    },[]);

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

,

要获取元素数组,您可以像这样操作:

let final = []
Object.keys(data).forEach(key => {
  let firstDot = key.indexOf('.')
  let id = key.substring(0,firstDot);
  if(!final[id]){
    final.push({})
  }
  final[id][key.substring(firstDot + 1)] = data[key]
  
})
console.log(final)

运行:https://jsbin.com/libevevanu/edit?js,console

,

您不能直接删除json的前2个字符,因为它们将是重复的键(例如:"0.id": 1,"1.id": 2,) 但是,这是一个更改此对象的小脚本:

{
    "0.id": 1,"0.vip": false
    "1.id": 2,"1.vip": false
    "2.id": 3,"2.vip": true
}

进入这个:

[
    {
        "id": 1,"details.first_name": "Gary","details.last_name": "Ortiz","details.nicknames.0.language": "italian","details.nicknames.0.value": "martello","details.nicknames.1.language": "inglese","details.nicknames.1.value": "hammer","details.email.0": "gortiz0@mapy.cz","details.email.1": "awilliamson1@narod.ru","country": "Indonesia","modified": "2015-05-16","vip": false
    },{
        "id": 2,"details.first_name": "Carl","details.last_name": "Jones","details.nicknames.0.language": "danish","details.nicknames.0.value": "wefwgge","details.nicknames.1.language": "Doich","details.nicknames.1.value": "egwrgerge","details.email.0": "erkhoej@google.net","details.email.1": "peeeeeeeeeeweqw@fb.ru","country": "Taiwan","modified": "2325-05-16","1.vip": false
    },{
        "id": 3,"details.first_name": "Michael","details.last_name": "Smith","details.nicknames.0.language": "Portoguese","details.nicknames.0.value": "wdqppppd","details.nicknames.1.language": "Russian","details.nicknames.1.value": "hamfwewdqqmer","details.email.0": "dcwrverg3@iissq.fr","details.email.1": "vvnvncmmxm@dqwdq.com","country": "Japan","modified": "1235-44-44","vip": true
    }
]

脚本:

const yourObject = {...};
const subObjects = {};
for (const key in yourObject) {
    const [indice,...subKey] = key.split('.');
    if (!indice in subObjects) {
        subObjects[indice] = {};
    }
    subObject[indice][subKey.join('.')] = yourObject[key];
}
// I assume you don't skip a number in your initial object
// -> If there is "3.",then there are "0.","1." and "2."
const array = [];
for (let indice=0; indice<Object.keys(subObjects).length; indice++) {
    array.push(subObject[indice]);
};

console.log(array); // <- Your list of sub objects

,

尝试一下:

const yourJson = [
    {
        "0.id": 1,"2.vip": true
    }
]

const result = Object.keys(js[0]).reduce((acc,key) => {
    acc[key.slice(2)] = js[0][key];
    return acc;
},{});

注意:如果删除前两个字符,则最终列表将是原始列表的1/3。 随着"0.id""1.id""2.id"都将变为"id"。其他键也一样。

,

在这种情况下,子字符串是定时炸弹。试试吧!

const jsonFile = [{ "0.id": 1,"2.vip": true }]
        var output = {}
        var mObj = jsonFile[0]
        var mKeys = Object.keys(mObj)
        for (const key of mKeys) {
            let splited = key.split(".")
            let x = splited.shift()
            output[x] = output[x] || {}
            output[x][splited.join(".")] = mObj[key]
        }
        console.log(Object.values(output));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。