我正在嘗試遍歷一個看起來像這樣的嵌套物件:
let obj = {
cols: [
{ name: 'name', type: 'String' },
{ name: 'dob', type: 'Number' },
{ name: 'address', type: 'String' },
{ name: 'income', type: 'String' },
{ name: 'vehicleNumber', type: 'Number' },
{ name: 'assets', type: 'Number' }
],
row: [
{
name: 'randomInfo',
columns: ['name', 'address', 'assets'],
}
]
}
我正在使用下面的邏輯回圈遍歷物件的陣列,比較它們是否相等,如果相等,我將它們回傳到一個陣列中。我試圖回傳 cols 鍵內的整個物件。例如,如果 cols 陣列的 name 值與 row 陣列的 columns 鍵的值匹配,(cols.name === row.columns[element],如果有匹配則回傳 cols 物件)
//loop through the obj and get the keys before this
let cols = cols.map(col => col.name);
let row = row.map(ind => ind.columns);
let rowNamesFlattened = [].concat.apply([], row);
let matchingCols = cols.filter(element => row.includes(element));
該matchingCols物件現在具有匹配的名稱,但我想最終也回傳它們的型別。知道如何做到這一點嗎?
uj5u.com熱心網友回復:
您可以filter直接在cols陣列上使用。但是在這里我假設row陣列只有 1 個元素
let obj = {
cols: [
{ name: 'name', type: 'String' },
{ name: 'dob', type: 'Number' },
{ name: 'address', type: 'String' },
{ name: 'income', type: 'String' },
{ name: 'vehicleNumber', type: 'Number' },
{ name: 'assets', type: 'Number' }
],
row: [
{
name: 'randomInfo',
columns: ['name', 'address', 'assets'],
}
]
}
let matchingCols = obj.cols.filter(({name}) => obj.row[0].columns.includes(name))
console.log(matchingCols)
row如果陣列中存在多個元素。可以flatMap用來獲取扁平化的列串列,然后執行與上述相同的程序
let obj = {
cols: [
{ name: 'name', type: 'String' },
{ name: 'dob', type: 'Number' },
{ name: 'address', type: 'String' },
{ name: 'income', type: 'String' },
{ name: 'vehicleNumber', type: 'Number' },
{ name: 'assets', type: 'Number' }
],
row: [
{
name: 'randomInfo',
columns: ['name', 'address', 'assets'],
},
{
name: 'randomInfo2',
columns: ['dob','name'],
}
]
}
let filtered = obj.cols.filter(({name}) => obj.row.flatMap(ind => ind.columns).includes(name))
console.log(filtered)
另一種使用 reduce. 所以不需要 2 個過濾器呼叫。參考了這個
let obj = {
cols: [
{ name: 'name', type: 'String' },
{ name: 'dob', type: 'Number' },
{ name: 'address', type: 'String' },
{ name: 'income', type: 'String' },
{ name: 'vehicleNumber', type: 'Number' },
{ name: 'assets', type: 'Number' }
],
row: [
{
name: 'randomInfo',
columns: ['name', 'address', 'assets'],
},
{
name: 'randomInfo2',
columns: ['dob','name'],
}
]
}
let flatted = obj.row.flatMap(ind => ind.columns);
const result = obj.cols.reduce((acc, curr) => {
acc[flatted.includes(curr.name) ? 'match' : 'unmatch'].push(curr);
return acc;
}, { match: [], unmatch: [] });
console.log(result)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/439547.html
標籤:javascript 节点.js 数组 目的 ecmascript-5
下一篇:S3上傳在生產中靜默失敗
