Вы можете добавить индекс для ключей из тех же массивов и вернуть новый объект для каждого вложенного массива.
function getFlat(array) {
return array.reduce((r, o, i) => {
Object
.entries(o)
.forEach(([k, v]) => Object.assign(r, Array.isArray(v)
? getFlat(v)
: { [[k, i].join('_')]: v }
));
return r;
}, {});
}
var data = [{ dimensionId: 1, dimensionName: "dimensionName1", components: [{ componentId: 2, componentName: "componentName2", indicators: [{ indicatorId: 3, indicatorName: "indicatorName3" }, { indicatorId: 4, indicatorName: "indicatorName4" }] }, { componentId: 5, componentName: "componentName5", indicators: [{ indicatorId: 6, indicatorName: "indicatorName6" }, { indicatorId: 7, indicatorName: "indicatorName8" }] }] }];
console.log(getFlat(data));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Я недавно использовал рубин-inifile. Возможно, это - излишество по сравнению с простыми отрывками здесь...
Если я понимаю правильно,
outFile = File.new('out.ini', 'w')
File.open('in.ini', 'r') do |inFile|
inFile.each_line do |line|
# foo is the entry you want to change, baz is its new value.
outFile.puts(line.sub(/foo=(.*)/, 'foo=baz'))
end
end
outFile.close
Обратите внимание на это, когда Вы будете использовать File.open
с блоком будет автоматически закрыт файл, когда блок завершится.
file = File.new("your.ini", "r")
while (line = file.gets)
puts "#{line}" #additionally make changes
end
file.close
Вот модуль для чтения и записи .ini-файлов с минимально возможным изменением исходного файла (для файлов, которые читают люди и машины):
class IniFileExc
класс IniNode def инициализировать (имя, значение = ноль) @line_start = -1; @line_end = -1; @level = 0; @name = имя; @value = значение; @keys = {}; @keylist = []; @modified = false; @deleted = ложь; конец attr_reader: level,: line_start,: line_end,: name,: value,: keylist,: keys,: modified,: deleted attr_writer: level,: line_start,: line_end,: name,: value,: keylist,: keys,: modified,: deleted
def to_str return @ name.to_s + '=' + @ value.to_s; конец
def to_s return @ value.to_s; конец def to_i return @ value.to_i конец def to_f return @ value.to_f; конец
def вставить (ключ, ноль); return @keys [ключ]; конец
def insert (ключ, значение) вернуть false if (@ keys.has_key? (key)); узел = ноль; if (значение && ((value.class == IniNode) || (value.class == IniSection))) узел = значение; еще если (@level <= 0) node = IniSection.new (ключ); еще node = IniNode.new (ключ, значение) конец конец node.line_start = @line_end + 1 если (node.line_start <0); node.level = @level + 1; @keys [ключ] = узел; @ keylist.push (ключ); вернуть истину; end
def [] = (ключ, значение) rc = insert (ключ, значение); @keys [ключ] .value = значение; @keys [ключ] .modified = true; @modified = true; конец
def delete (ключ) вернуть false if (! @ keys.has_key? (key)); @keys [ключ] .deleted = true; @modified = true; конец конец
класс IniSection def to_str
return ('[' + @name + ']');
конец
конец
def reload
начать
input = File.new (@name, "r");
спасение
поднять;
еще
prevnode = node = self;
бельеo = 0;
input.each do | line |
@ lines.push (строка);
parsed_node = parse_line (белье, строка);
если (parsed_node);
если (parsed_node.class == IniSection)
если (parsed_node! = узел)
prev_node = узел;
узел = parsed_node;
вставить (имя узла, узел);
prev_node.line_end = белье - 1;
конец
еще
node.insert (parsed_node.name, parsed_node);
конец
конец
белье + = 1;
конец
input.close; end def parse_line (белье, строка)
вернуть ноль if (line = ~ / ^ \ s * $ /);
вернуть ноль if (line = ~ / ^ \ s * # /);
вернуть ноль if (line = ~ / ^ \ s *; /);
если (строка = ~ /^\s*[\s*(.+)\s**********************************************)
rv = IniSection.new ($ 1);
rv.line_start = белье;
rv.level = @level + 1;
return rv;
elsif (line = ~ /^\s(\S?.[1127164 impression[^=\s ])\s=\s*(\S?[^#;[^ #; \ s \ n]). $ /)
rv = IniNode.new ($ 1, $ 2);
rv.line_start = rv.line_end = белье;
rv.level = @level + 2;
return rv;
конец
вернуть ноль;
конец def запись
вставлено = {};
@ keylist.each do | sect |
sectnode = @keys [секта];
следующий if (! sectnode.modified || sectnode.deleted);
если (sectnode.line_end <0)
@ lines.push ("\ п");
@lines.push (sectnode.to_str + "\ n");
конец
sectnode.keylist.each do | key |
keynode = sectnode.keys [ключ];
следующий if (! keynode.modified || keynode.deleted);
если (keynode.line_end <0)
если (sectnode.line_end <0)
@ lines.push (keynode.to_str + "\ n");
еще
idx = sectnode.line_end.to_i;
вставлено [idx] = [] если (! Insert.has_key? (idx));
вставлен [idx] .push (keynode.to_str);
конец
еще
line = @lines [keynode.line_start];
if (line = ~ / ^ (\ s *) (\ S?. [^ = \ s] \ s = \ s * \ S?. + [^ #; \ s]) (\ s * [#;]. ) $ /)
строка = $ 1 + keynode.to_str + $ 3 + "\ n";
еще
line = line.gsub (/ ^ (\ s ) (\ S?. [^ = \ s] \ s = \ s * \ S? [^ #;] + [^ # ; \ n \ s]) (. *) $ /) {
$ 1 + keynode.to_str + $ 3};
конец
@lines [keynode.line_start] = строка;
конец
конец
конец
конец
конец
Пример использования: Надеюсь, это поможет.
класс IniFile
node.line_end = @line_end = lineno - 1;
end
удалено = {};
@ keylist.each do | sect |
sectnode = @keys [секта];
следующий, если (! sectnode.deleted &&! sectnode.modified);
if (sectnode.deleted && (sectnode.line_start> = 0) && (sectnode.line_end> = 0) \
&& (sectnode.line_end> = sectnode.line_start))
для i в sectnode.line_start..sectnode.line_end
удалено [я] = истина;
конец
конец
sectnode.keylist.each do | key |
keynode = sectnode.keys [ключ];
следующий, если (! keynode.deleted);
удалено [keynode.line_start.to_i] = true \
если ((keynode.line_start> = 0) && (keynode.line_end> = 0) && (keynode.line_start == keynode.line_end));
конец
конец
begin
file = File.new(@name, 'w');
rescue
raise(IniFileExc, "Failed to open " + @name + " for writing: #{$!}", caller);
else
cnt = -1;
@lines.each do |line|
cnt += 1;
if (inserted.has_key?(cnt))
inserted[cnt].each do |ins|
file.puts(ins + "\n");
end
end
next if (deleted[cnt]);
file.puts(line);
end
file.close;
end
begin
ini = IniFile.new('file.ini');
ini['common']['param'] = 'value';
ini['common'].delete('unused_param');
ini.delete('unused_section');
print "Valuable value: ", ini['common']['param'], "\n";
ini.write;
rescue IniFileExc
print "Oh, that's not good: ", $!, "\n";
end