提问者:小点点

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


我有一个JSON平面数组,里面有一个对象:

null

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)

null

问题是:我需要取消对象的每个元素的前两个字符。例如,这个:

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

需要变成这样:

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

有人知道怎么做吗?我试过splice和map,但它们都不起作用,因为它是一个对象而不是数组。


共3个答案

匿名用户

  • 使用object.entries,可以从每个对象生成[key,value]对。
  • 使用Array.Reduce,您可以生成从键中提取2个字符的结果对象。

null

const input = [ { "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 } ] 

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);

匿名用户

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

null

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);

匿名用户

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

null

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, "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 }],
    result = data.reduce((r, o) => {
        Object.entries(o).forEach(([k, v]) => setValue(r, k, v));
        return r;
    }, []);

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