我希望有人能幫助我解決我的問題!我沒有通過搜索找到正確的東西,也許有人可以給我一個提示。
我正在呼叫一個 API,它回傳一個物件,該物件又包含嵌套物件。在這些嵌套物件中,有兩個屬性“value”和“scale”。我想把這兩個屬性分開,寫成同一個物件中的屬性。
我從 API 獲得的資料是動態的,這意味著它在不斷變化。
例子:
// call api
const apiCall = callApi(...);
// return object
console.log(apiCall);
{
id: '3454353458764389759834534534',
json_data: {
persons: {
de: {
name: 'Bob',
data: {
scale: 100,
value: 2459,
},
},
be: {
name: 'Alice',
data: {
scale: 10000,
value: 1459,
},
},
},
url: 'https://stackoverflow.com/',
timestamp: '2021-10-23T12:00:11 00:00',
disclaimer: 'Some bla bla',
},
}
// targed object
const objTarged = {
id: '3454353458764389759834534534',
json_data: {
persons: {
de: {
name: 'Bob',
data: {
scale: 100,
value: 2459,
result: 24.59 // value / scale = result
},
},
be: {
name: 'Alice',
data: {
scale: 10000,
value: 1459,
result: 0.1459 // value / scale = result
},
},
},
url: 'https://stackoverflow.com/',
timestamp: '2021-10-23T12:00:11 00:00',
disclaimer: 'Some bla bla',
},
};
我的想法:
- 我需要將物件映射到新物件嗎?
- 如果源物件不斷變化,我該怎么做(Object.values?)
- 每次呼叫 API 時,如何將 Value / Scale 的結果寫入同一物件中的新屬性?
提前致謝:)
uj5u.com熱心網友回復:
我將創建一個mapValues()接受一個物件的函式,并通過在轉換函式中傳遞每個物件的值來創建一個新物件。
每當 api 呼叫回傳一個新物件時,我們都會result根據結構重新創建具有屬性的新物件。
該mapValues功能是如何作業的?
每當一個物件(或陣列)被傳遞給 時mapValues,它就會被轉換為一個[key, value]成對陣列。然后[key, pair]通過應用transformFn到值將這些對映射到新條目。然后將轉換對陣列轉換回 using Object.fromEntries()。
const mapValues = (transformFn, obj) => Object.fromEntries(
Object.entries(obj)
.map(([key, value]) => [key, transformFn(value)])
)
const apiCall = {"persons":{"de":{"name":"Bob","scale":100,"value":2459},"be":{"name":"Alice","scale":10000,"value":1459}}}
const result = mapValues(
val => mapValues(v => ({
...v,
result: v.value / v.scale,
}), val),
apiCall
)
console.log(result)
如果您有多個嵌套級別的屬性您不想轉換,我們還可以將 傳遞key給 以transformFn進行更精細的更改。現在我們可以創建一個遞回函式來遍歷樹,并且只更新具有特定鍵的物件。
const mapValues = (transformFn, obj) => Object.fromEntries(
Object.entries(obj)
.map(([key, value]) => [key, transformFn(value, key)])
)
const fn = obj => mapValues(
(val, key) => {
// if the key is data create a new object with a result property
if(key === 'data') return ({
...val,
result: val.value / val.scale,
})
// if it's object pass it to the recursive function
if(typeof val === 'object') return fn(val)
return val
},
obj
)
const apiCall = {"id":"3454353458764389759834534534","json_data":{"persons":{"de":{"name":"Bob","data":{"scale":100,"value":2459}},"be":{"name":"Alice","data":{"scale":10000,"value":1459}}},"url":"https://stackoverflow.com/","timestamp":"2021-10-23T12:00:11 00:00","disclaimer":"Some bla bla"}}
const result = fn(apiCall)
console.log(result)
uj5u.com熱心網友回復:
將問題分解為首先查找具有您感興趣的鍵的嵌套物件可能會有所幫助。這樣做后,使用所需的計算來擴充這些物件將很容易。
下面是一種通用函式,它根據具有特定鍵的嵌套物件查找嵌套物件。有了這個,fixMyApiData自己寫...
// return an array of objects that are nested in the passed object which contain the passed key
function objectsContainingKey(object, key) {
let results = [];
Object.keys(object).forEach(k => {
if (k === key) results.push(object);
if (object[k] && typeof object[k] === 'object')
results = results.concat(objectsContainingKey(object[k], key));
});
return results;
}
// find the nested objects we care about and augment them with the value/scale calculation
function fixMyApiData(apiData) {
objectsContainingKey(apiData, 'scale').forEach(data => {
if (data.value) data.result = data.value / data.scale;
})
}
let apiData = {
id: '3454353458764389759834534534',
json_data: {
persons: {
de: {
name: 'Bob',
data: {
scale: 100,
value: 2459,
},
},
be: {
name: 'Alice',
data: {
scale: 10000,
value: 1459,
},
},
},
url: 'https://stackoverflow.com/',
timestamp: '2021-10-23T12:00:11 00:00',
disclaimer: 'Some bla bla',
},
};
fixMyApiData(apiData);
console.log(apiData);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/333862.html
標籤:javascript 节点.js json 目的
上一篇:JavaScript-通過Flask獲取串列的第i個元素
下一篇:無法在APIJSON中獲得成績
