通过使用 Javascript 操作现有 JSON 对象来创建 JSON 对象

Create JSON object by manipulating existing JSON object using Javascript

本文关键字:对象 JSON 创建 操作 Javascript      更新时间:2023-09-26

我有一个JSON对象,我正在其中操作数据并尝试构造一个新的JSON对象。问题是我无法找到创建 JSON 对象的动态部分。这是实际的 JSON 对象

[{"acptFlag":true,"count":14288,"limsFlag":true,"plantId":30,"plantName":"Camilla, GA","supplierId":20,"supplierName":"Keystone Foods"},{"acptFlag":false,"count":344,"limsFlag":true,"plantId":30,"plantName":"Camilla, GA","supplierId":20,"supplierName":"Keystone Foods"},{"acptFlag":false,"count":700,"limsFlag":true,"plantId":31,"plantName":"Albany, KY","supplierId":20,"supplierName":"Keystone Foods"},{"acptFlag":true,"count":9500,"limsFlag":true,"plantId":31,"plantName":"Albany, KY","supplierId":20,"supplierName":"Keystone Foods"},{"acptFlag":false,"count":227,"limsFlag":true,"plantId":32,"plantName":"Green Forest, AR","supplierId":21,"supplierName":"Tyson Foods"},{"acptFlag":true,"count":7049,"limsFlag":true,"plantId":32,"plantName":"Green Forest, AR","supplierId":21,"supplierName":"Tyson Foods"},{"acptFlag":true,"count":10742,"limsFlag":true,"plantId":33,"plantName":"Dawson, GA","supplierId":21,"supplierName":"Tyson Foods"},{"acptFlag":false,"count":506,"limsFlag":true,"plantId":33,"plantName":"Dawson, GA","supplierId":21,"supplierName":"Tyson Foods"}]

所需的 JSON 对象是

[{"supplierName":"Keystone Foods","1":(344/(344+14288)) , "2":700/(700+9500))}},{"supplierName":"Tyson Foods"","1":(227/(227+7049)) , "2":(506/(506+10742))}}]

在这里,我试图将"Keystone Foods"数据放在一个对象中。 "1":(344/(344+14288)) , "2":700/(700+9500))表示假计数/真计数。"1"和"2"代表植物的计数。我在构建植物计数代码时陷入了困境。

这是我现有的代码。

var resultJSON = {}, arr = [];
var jsonObj = JSON.parse(obj)
for (var key in jsonObj) {
  if (jsonObj.hasOwnProperty(key)) {
    var val = jsonObj[key];
    var supplierName = val.supplierName;
    arr.push(supplierName);    
  }
}
var M = {}, R = []
getUniqueSuppliers(arr)
function getUniqueSuppliers(arr) {
   for(var i = 0; i < arr.length; i++) {
      M[arr[i]] = "supplierName"
   }
  for(var i in M) {
    R.push(i)
  }
}
checkEachSupplier(R)
function checkEachSupplier(R) { 
    for (var index = 0; index < R.length; index++) {
       var supplierName = R[index]
       createNewJSON(supplierName)
   }
}
getPlantTotalValueBasedOnSupplier(R);
function createNewJSON(supplierName) {
    for (var key in jsonObj) {
       if (jsonObj.hasOwnProperty(key)) {
       var val = jsonObj[key];    
       if(supplierName == val.supplierName) {       
         resultJSON[supplierName] = {"supplierName" : supplierName}
       }
     }
   }
 }
 console.log(resultJSON)

我的杰伦斯小提琴:https://jsfiddle.net/7u5qphx9/6/

也许这会有所帮助。

它使用临时对象temp用于count

{
    "Keystone Foods": {
        "30": {
            "true": 14288,
            "false": 344
        },
        "31": {
            "false": 700,
            "true": 9500
        }
    },
    "Tyson Foods": {
        "32": {
            "false": 227,
            "true": 7049
        },
        "33": {
            "true": 10742,
            "false": 506
        }
    }
}

部分代码:

temp = obj1.reduce(function (r, a) {
    // ...
    return r;
}, {}),

Array.prototype.reduce()遍历obj1,并将空对象作为起始值。回调函数返回对象r,用于下一个迭代步骤,或在结束时返回结果。

r[a.supplierName] = r[a.supplierName] || {};

一个简短的写作,如果r[a.supplierName]有一些值,比取r[a.supplierName],否则做一个新对象

{
    "Keystone Foods": {}
}
r[a.supplierName][a.plantId] = r[a.supplierName][a.plantId] || {};

这里的物业plantID也是如此。如果没有值,则会创建一个新对象。

{
    "Keystone Foods": {
        "30": {}
    }
}
r[a.supplierName][a.plantId][a.acptFlag] = a.count;

这会将count分配给 a.acptFlag 值的属性。

{
    "Keystone Foods": {
        "30": {
            "true": 14288
    },
}

那是针对对象的。现在,我看一下使用所需对象构建新数组的部分o.

obj2 = Object.keys(temp).map(function (k) {
    // ...
    return o;
});

首先从temp获取所有键,并使用Array.prototype.map()迭代它,因为这应该构建一个新的数组。

在回调函数内部

var o = { supplierName: k };

使用属性supplierName和实际键的值生成一个新对象。

Object.keys(temp[k]).forEach(function (kk, i) {
    // ...
});

现在要迭代 plantId 的下一级键。

o[i + 1] = '' + temp[k][kk].false + ' / (' + temp[k][kk].false + ' + ' + temp[k][kk].true + ')';

对于每个 plantID,都会使用真属性和假属性的值创建一个新属性。分配的值是一个字符串。(如果行更改为 o[i + 1] = temp[k][kk].false / (temp[k][kk].false + temp[k][kk].true);,则可能是数字)。

var obj1 = [{ "acptFlag": true, "count": 14288, "limsFlag": true, "plantId": 30, "plantName": "Camilla, GA", "supplierId": 20, "supplierName": "Keystone Foods" }, { "acptFlag": false, "count": 344, "limsFlag": true, "plantId": 30, "plantName": "Camilla, GA", "supplierId": 20, "supplierName": "Keystone Foods" }, { "acptFlag": false, "count": 700, "limsFlag": true, "plantId": 31, "plantName": "Albany, KY", "supplierId": 20, "supplierName": "Keystone Foods" }, { "acptFlag": true, "count": 9500, "limsFlag": true, "plantId": 31, "plantName": "Albany, KY", "supplierId": 20, "supplierName": "Keystone Foods" }, { "acptFlag": false, "count": 227, "limsFlag": true, "plantId": 32, "plantName": "Green Forest, AR", "supplierId": 21, "supplierName": "Tyson Foods" }, { "acptFlag": true, "count": 7049, "limsFlag": true, "plantId": 32, "plantName": "Green Forest, AR", "supplierId": 21, "supplierName": "Tyson Foods" }, { "acptFlag": true, "count": 10742, "limsFlag": true, "plantId": 33, "plantName": "Dawson, GA", "supplierId": 21, "supplierName": "Tyson Foods" }, { "acptFlag": false, "count": 506, "limsFlag": true, "plantId": 33, "plantName": "Dawson, GA", "supplierId": 21, "supplierName": "Tyson Foods" }],
    temp = obj1.reduce(function (r, a) {
        r[a.supplierName] = r[a.supplierName] || {};
        r[a.supplierName][a.plantId] = r[a.supplierName][a.plantId] || {};
        r[a.supplierName][a.plantId][a.acptFlag] = a.count;
        return r;
    }, {}),
    obj2 = Object.keys(temp).map(function (k) {
        var o = { supplierName: k };
        Object.keys(temp[k]).forEach(function (kk, i) {
            o[i + 1] = '' + temp[k][kk].false + ' / (' + temp[k][kk].false + ' + ' + temp[k][kk].true + ')';
        });
        return o;
    });
document.write('<pre>' + JSON.stringify(temp, 0, 4) + '</pre>');
document.write('<pre>' + JSON.stringify(obj2, 0, 4) + '</pre>');