[英]In JavaScript, what is the best way to convert a NodeList to an array?
[英]Best way to convert array in javascript
我正在开发一个反应应用程序,我从 api 调用中获取以下数组。
var arrayLike ={
"2020-W1": [
{
"type": "TAX_REFUND_IN_INT",
"net_amount_base": "500001"
},
{
"type": "TAX_REFUNDIN_IN_EXT",
"net_amount_base": "500002"
}
],
"2020-W2": [
{
"type": "RENTAL_LEASING_INCOME_IN_INT",
"net_amount_base": "5000"
},
{
"type": "DIVIDENTS_INCOME_IN_INT",
"net_amount_base": "15000"
},
{
"type": "LICENCE_INCOME_IN_EXT",
"net_amount_base": "10000"
},
{
"type": "OTHER_INCOME_IN_EXT",
"net_amount_base": "1000"
}
]
}
我想像下面这样转换这个数组:
var new_arr = var new_arr = [{
year_week: '2020-W1',
TAX_REFUND_IN_INT: '1000',
TAX_REFUNDIN_IN_EXT: '300'
},
{
year_week: '2020-W2',
RENTAL_LEASING_INCOME_IN_INT: '2000',
DIVIDENTS_INCOME_IN_INT: '15000',
LICENCE_INCOME_IN_EXT: '10000',
OTHER_INCOME_IN_EXT: '1000'
} ]
有人可以帮我怎么做吗? 如果需要,我也可以更改源数组,因为我可以控制 API。如果需要更多信息,请告诉我。
您可以只遍历数组,然后取出您想要的部分。 如果您的传入数据在actual_arr
var actual_arr = {
"2020-W1" :{
0: {site_id: "004", year_week: "2020-W1", type: "RENTAL_LEASING_INCOME", in_out: "IN", int_ext: "INT","amount" :1000},
1: {site_id: "004", year_week: "2020-W1", type: "DIVIDENTS_INCOME", in_out: "IN", int_ext: "INT","amount" :300},
2: {site_id: "004", year_week: "2020-W1", type: "LICENCE_INCOME", in_out: "IN", int_ext: "INT","amount" :20},
3: {site_id: "004", year_week: "2020-W1", type: "OTHER_INCOME", in_out: "IN", int_ext: "INT","amount" :100 },
},
}
const new_arr = Object.keys(actual_arr).map(key=> {
// Build an object to receive the values
const object = {year_week: key}
Object.keys(actual_arr[key]).forEach(ix => {
const income_name = actual_arr[key][ix].type
const income_amount = actual_arr[key][ix].amount
object[income_name] = income_amount
})
return object
})
var arrayLike = { "2020-W1": [{ "type": "TAX_REFUND_IN_INT", "net_amount_base": "500001" }, { "type": "TAX_REFUNDIN_IN_EXT", "net_amount_base": "500002" } ], "2020-W2": [{ "type": "RENTAL_LEASING_INCOME_IN_INT", "net_amount_base": "5000" }, { "type": "DIVIDENTS_INCOME_IN_INT", "net_amount_base": "15000" }, { "type": "LICENCE_INCOME_IN_EXT", "net_amount_base": "10000" }, { "type": "OTHER_INCOME_IN_EXT", "net_amount_base": "1000" } ] } let newArray = [] Object.values(arrayLike).forEach((arr, index) => { let newObj = {} newObj['yearWeek'] = Object.keys(arrayLike)[index] arr.forEach((item) => { newObj[`${item.type}`] = item.net_amount_base }) newArray.push(newObj) }) console.log(newArray)
编辑:更新了一个片段!
您可以尝试使用map
进行一些数组操作, reduce
。
下面的片段可能会有所帮助
const arr = { "2020-W1": { 0: { site_id: "004", year_week: "2020-W1", type: "RENTAL_LEASING_INCOME", in_out: "IN", int_ext: "INT", amount: 1000 }, 1: { site_id: "004", year_week: "2020-W1", type: "DIVIDENTS_INCOME", in_out: "IN", int_ext: "INT", amount: 300 }, 2: { site_id: "004", year_week: "2020-W1", type: "LICENCE_INCOME", in_out: "IN", int_ext: "INT", amount: 20 }, 3: { site_id: "004", year_week: "2020-W1", type: "OTHER_INCOME", in_out: "IN", int_ext: "INT", amount: 100 }, }, "2020-W2": { 0: { site_id: "004", year_week: "2020-W2", type: "RENTAL_LEASING_INCOME", in_out: "IN", int_ext: "INT", amount: 2000 }, 1: { site_id: "004", year_week: "2020-W2", type: "DIVIDENTS_INCOME", in_out: "IN", int_ext: "INT", amount: 400 }, 2: { site_id: "004", year_week: "2020-W2", type: "LICENCE_INCOME", in_out: "IN", int_ext: "INT", amount: 2000 }, 3: { site_id: "004", year_week: "2020-W2", type: "OTHER_INCOME", in_out: "IN", int_ext: "INT", amount: 5000 }, }, "2020-W3": { 0: { site_id: "004", year_week: "2020-W3", type: "RENTAL_LEASING_INCOME", in_out: "IN", int_ext: "INT", amount: 1000 }, 1: { site_id: "004", year_week: "2020-W3", type: "DIVIDENTS_INCOME", in_out: "IN", int_ext: "INT", amount: 2000 }, 2: { site_id: "004", year_week: "2020-W3", type: "LICENCE_INCOME", in_out: "IN", int_ext: "INT", amount: 3000 }, 3: { site_id: "004", year_week: "2020-W3", type: "OTHER_INCOME", in_out: "IN", int_ext: "INT", amount: 4000 }, }, } const res = Object.keys(arr).map((year_week) => { const typeAmounts = Object.keys(arr[year_week]).reduce( (acc, index) => ({...acc, [arr[year_week][index].type]: arr[year_week][index].amount, }), {} ) return { year_week, ...typeAmounts, } }) console.log(res)
试试这个,这给出了您正在寻找的确切格式(对象数组)。
在这种情况下,我使用 Set() 删除重复项,然后使用扩展运算符 (...) 将其转换回包含所有唯一对象的数组。 也有一些方法可以用 .reduce() 和 .filter() 做同样的事情。 以下是一些可能有用的资源。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/Set
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax
https://www.w3schools.com/jsref/jsref_reduce.asp
https://www.w3schools.com/jsref/jsref_filter.asp
let arrayLike = { "2020-W1": [{ "type": "TAX_REFUND_IN_INT", "net_amount_base": "500001" }, { "type": "TAX_REFUNDIN_IN_EXT", "net_amount_base": "500002" } ], "2020-W2": [{ "type": "RENTAL_LEASING_INCOME_IN_INT", "net_amount_base": "5000" }, { "type": "DIVIDENTS_INCOME_IN_INT", "net_amount_base": "15000" }, { "type": "LICENCE_INCOME_IN_EXT", "net_amount_base": "10000" }, { "type": "OTHER_INCOME_IN_EXT", "net_amount_base": "1000" } ] } function solveProblem(arrayLike) { let final_array = [] let newObjectOne = {} let newObjectTwo = {} for (i in arrayLike) { for (z in i) { if (i === "2020-W1") { if (arrayLike[i][z],== undefined) { newObjectOne["year_week"] = "2020-W1". newObjectOne[arrayLike[i][z].type] = arrayLike[i][z].net_amount_base final_array,push(newObjectOne) } } if (i === "2020-W2") { if (arrayLike[i][z].== undefined) { newObjectTwo["year_week"] = "2020-W2". newObjectTwo[arrayLike[i][z].type] = arrayLike[i][z].net_amount_base final_array.push(newObjectTwo) } } } } let unqiueItemsArr = new Set(final_array) return [...unqiueItemsArr] } //console.log(solveProblem(arrayLike)) to see new array of objects console.log(solveProblem(arrayLike))
使用Object.entreis
, map
, Object.fromEntries
进行转换。
const convert = data => Object.entries(data).map(([year_week, arr]) => ({ year_week, ...Object.fromEntries(arr.map(Object.values)), })); var arrayLike = { "2020-W1": [ { type: "TAX_REFUND_IN_INT", net_amount_base: "500001", }, { type: "TAX_REFUNDIN_IN_EXT", net_amount_base: "500002", }, ], "2020-W2": [ { type: "RENTAL_LEASING_INCOME_IN_INT", net_amount_base: "5000", }, { type: "DIVIDENTS_INCOME_IN_INT", net_amount_base: "15000", }, { type: "LICENCE_INCOME_IN_EXT", net_amount_base: "10000", }, { type: "OTHER_INCOME_IN_EXT", net_amount_base: "1000", }, ], }; console.log(convert(arrayLike));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.