Создать json файл с одинаковой структурой

437
24 ноября 2016, 10:25

Ребята незнаю как написать javascript, который создает json с одинаковой структурой как и в оригинальном файле, но только на одном языке например в cz-CZ и естественно чтоб содержал только отсутствующии лейблы.

P.S лейблы это все элементы страницы. Парсер написал, но опять же незнаю как передать название файла источника и язык источника в качестве входного параметра .

var fs = require("fs");
fs.readFile('labels.json', function (err, data) {
    if (err) {
       return console.error(err);
    }
console.log(data.toString());
var obj = JSON.parse(data)
fs.writeFile('labels.cz-CZ.json');
});

пример самого json файла, в нем лейблы то есть содержание страницы на двух языках, надо чтоб javascript как бы создавал json в котором лейблы только те которые не перевелись или перевода не существует

"Shell": {
        "Profile": "Profile",
        "SignOut": "Sign out",
        "CloseView": "Close current view",
        "Settings": "Settings",
        "ModifySettings": "Modify settings",
        "SettingsModified": "Settings have been changed",
        "Help": "Help"
}
Answer 1

Думаю вам нужно просто сравнить два объекта.

Предположим мы загрузили два объекта из файлов:

var target = JSON.parse(dataDefault);
var current = JSON.parse(dataCZ);

Далее сравниваем все проперти, если такой проперти нет или ее значение равно исходному то записываем в результирующий объект:

var result = {};
for (var key in target) {
    if (!target.hasOwnProperty(key))
        continue;
    if (target[key] == current[key] || !current[key]) {
        result[key] = target[key];
    }
}

Далее сохраняем:

fs.writeFile("result.json", JSON.stringify(result));

Обновление:

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

function compare(target, current){
    var result = {};
    for (var key in target) {
        if (!target.hasOwnProperty(key))
            continue;
        if(typeof target[key] == "object"){
            result[key] = compare(target[key], current[key])
        } else {
            if (target[key] == current[key] || !current[key]) {
                result[key] = target[key];
            }
        }
    }
    return result;
}

И вызвать:

fs.writeFile("result.json", JSON.stringify(compare(target, current)));

var target = { 
	"Shell" : { 
		"Profile" : "Profile", 
		"SignOut" : "Sign out", 
		"CloseView" : "Close current view", 
		"Settings" : "Settings", 
		"ModifySettings" : "Modify settings", 
		"SettingsModified" : "Settings have been changed", 
		"Help" : "Help" 
	} 
} 
var current = { 
	"Shell" : { 
		"Profile" : "Профиль", 
		"SignOut" : "Выйти", 
		"CloseView" : "", 
		"Settings" : "Settings", 
		"ModifySettings" : "Дополнительные настройки", 
		"Help" : "Помощь" 
	} 
}; 
 
function compare(target, current) { 
	var result = {}; 
	for (var key in target) { 
		if (!target.hasOwnProperty(key)) 
			continue; 
		if (typeof target[key] == "object") { 
			result[key] = compare(target[key], current[key]) 
		} else { 
			if (target[key] == current[key] || !current[key]) { 
				result[key] = target[key]; 
			} 
		} 
	} 
	return result; 
} 
 
console.log(compare(target, current));

Обновление 2

Ваш код должен выглядеть как то так:

// получить третий аргумент из командной строки
var name = process.argv[2];
var defaultName = "en_US";
var file = {/*...*/}
var nfResult = {};
if(!file[name]){
    nfResult = file[name] = name[defaultName];
} else {
    nfResult = compare(name[defaultName], file[name]);
}
READ ALSO
Настройка CKeditor и KCfinder

Настройка CKeditor и KCfinder

Есть два редактора CKeditor 4. 6.

726
Не работает audio.get через VKApi на js

Не работает audio.get через VKApi на js

Итак, первым делом я сделал это:.

469
Битрикс24 формы

Битрикс24 формы

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

500
Вопрос по js - selecet

Вопрос по js - selecet

Как можно сделать так, чтобы при выборе в селекте был полный список - option. Но когда какой-то option выбран - убирать все остальные варианты? Желательно...

423