Заполните JSON от другого, используя JavaScript - PullRequest
0 голосов
/ 30 октября 2018

Дан пустой JSON 1:

JSON1 = {
  "person": { "firstName": "" },
  "products": { "packName": "", "packSize": "" }
}

и JSON 2, который имеет больше полей, чем JSON 1:

JSON2 = {
  "person": { "firstName": "Ahmed", "job": "Doctor" },
  "products": { "packName": "antibiotic", "packSize": "large" }
}

Я хочу заполнить JSON 1 соответствующими значениями в JSON 2

{
  "person": { "firstName": "Ahmed" },
  "products": { "packName": "antibiotic", "packSize": "large" }
}

Я пробовал несколько способов, но не добирался

var newObj = {};
var parsedJson1 = JSON.parse(tw.local.JSON1);
var parsedJson2 = JSON.parse(tw.local.JSON2);
var i;

for (i in parsedJson1) {
    var key=i;
    var subkey=i;
    for (j in parsedJson2) {
        var k=j;
        var s=j;
        if (key == k && subkey == s) {
            newObj[key][subkey] = parsedJson2[j];
        }
    }
}
tw.local.stringifiedJSON = JSON.stringify(newObj);

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Вы должны использовать рекурсию, чтобы пересечь целевой объект для устойчивости. Я отформатировал код для лучшей читаемости.

function getNode(obj, path) {
    var ret = obj;
    try {
        // replace forEach with for-loop for browser compatibilities
        path.forEach(function (p) {
            ret = ret[p];
        });
    } catch (e) {
        return undefined;
    }
    return ret;
}

function fillJSONWithAnother(target, source, path) {
    if (!(target && source)) return target;
    // Assign path as an empty array for first call
    path = path || [];

    // Get target node and source node for comparing
    var targetValue = getNode(target, path);
    var sourceValue = getNode(source, path);
    // targetValue is not a leaf node (i.e. is Object), should traverse its children nodes
    if (targetValue && typeof targetValue === "object") {
        for (var key in targetValue) {
            fillJSONWithAnother(target, source, path.concat([key]));
        }
    }
    // targetValue is a leaf node (i.e. not Object) and source value exists, set corresponding value
    else if (sourceValue !== undefined) {
        var node = getNode(target, path.slice(0, path.length - 1));
        node[path[path.length - 1]] = sourceValue;
    }
    return target;
}

// Test case
var obj1 = {
    "person": {
        "firstName": ""
    },
    "products": {
        "packName": "",
        "packSize": "l"
    }
};
var obj2 = {
    "person": {
        "firstName": "Ahmed",
        "job": "Doctor"
    },
    "products": {
        "packName": "antibiotic",
        "packSize": "large"
    }
}
fillJSONWithAnother(obj1, obj2);
// {"person":{"firstName":"Ahmed"},"products":{"packName":"antibiotic","packSize":"large"}}
0 голосов
/ 30 октября 2018

Вот пример того, как это сделать:

Обратите внимание, что это предполагает следующее:

  1. вы знаете, что второй объект будет иметь все необходимые ключи.
  2. все значения на первом уровне являются объектами
  3. обратите внимание, что это решение будет работать только для указанной структуры, и если вам нужно обработать любые варианты, вам нужно будет сделать его более оборонительным.

Шаги:

  • перебрать действительные ключи (все ключи на JSON1)
  • для каждого действительного ключа, добавьте его к newObj и итерируйте по действительному subKeys
  • копировать значения из JSON2 в newObj

Примечание. Я немного изменил ваш код, чтобы его можно было выполнить на этом сайте

const JSON1 = `{
  "person": { "firstName": "" },
  "products": { "packName": "", "packSize": "" }
}`;

const JSON2 = `{
  "person": { "firstName": "Ahmed", "job": "Doctor" },
  "products": { "packName": "antibiotic", "packSize": "large" }
}`;


const parsedJson1 = JSON.parse(JSON1);
const parsedJson2 = JSON.parse(JSON2);
const newObj = {};
const validKeys = Object.keys(parsedJson1);

for (let i of Object.keys(parsedJson1)) {
  if (newObj[i] === undefined) {
    newObj[i] = {};
  }
  for (let j of Object.keys(parsedJson1[i])) {
    newObj[i][j] = parsedJson2[i][j];
  }
}

console.log(JSON.stringify(newObj));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...