パスに基づいてオブジェクトを動的に変更しようとしています。しかし、私はいくつかの問題を抱えています。パスの値を取得する以下のメソッドがありますが、パスの値を変更する必要があります。パスの長さも重要ではないのでprop.prop.prop.prop
、大丈夫です。例えば
let dataObj = {
name: 'Old Name',
address: {
state: 'CA',
timezone: 'America/California'
}
}
let modifiedValues = {
'name': 'New Name'
'address.state': 'FL',
'address.timezone': 'America/New_York'
}
2番目のオブジェクトをループし、キーと値を使用して最初のオブジェクトを変更するか、その構造に従う新しいオブジェクトを作成できるようにしたいです。そうすれば、次のようなオブジェクトが得られます。
let dataObj = {
name: 'New Name',
address: {
state: 'FL',
timezone: 'America/New_York'
}
}
参照用のパスに基づいて値を取得する方法は次のとおりです。
getAttributeFromPath(path: string, entity: any): any {
return path.split('.').reduce((a, b) => a && a[b], entity);
}
のバージョンを作成getAttributeFromPath
してパスから属性を設定し、これを使用して最初のオブジェクトを変更できます。
以下では、の代わりにsetAttributeFromPath
を使用してバージョン()を作成しました:forEach
reduce
let dataObj = {
name: 'Old Name',
address: {
state: 'CA',
timezone: 'America/California'
}
};
let modifiedValues = {
'name': 'New Name',
'address.state': 'FL',
'address.timezone': 'America/New_York'
};
const setAttributeFromPath = (path, entity, value) => {
const pathParts = path.split('.');
let obj = entity;
pathParts.forEach((part, index) => {
if (obj[part]) {
if (index < pathParts.length - 1) {
obj = obj[part];
} else {
obj[part] = value;
}
}
});
};
Object.entries(modifiedValues).forEach(([key, value]) => {
setAttributeFromPath(key, dataObj, value);
});
console.log(dataObj);
setAttributeFromPath
を使用した素敵なワンライナーバージョンを考え出すことができますreduce
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加