2017-06-02 184 views
0

目標是將硬編碼的數據庫列名從我的React組件移除到配置文件中。而不是使用data.X,它將是data.A,如下所示。這樣,如果他們將X更改爲其他內容,我只需要更改X的配置文件,然後在我的React組件中隨時更新它的配置文件,因爲data.A位於組件中。過濾基於對象數組的對象數組返回相同的結果

問題是過濾只返回數據中的最後一個對象。任何幫助將不勝感激,任何關於刪除嵌套for循環的建議將有助於學習。

所需的輸出:

[ 
    { 
     "A": 1, 
     "B": 2, 
    }, 
    { 
     "A": 4, 
     "B": 5, 
    }, 
    { 
     "A": 7, 
     "B": 8, 
    }, 
]; 

電流輸出:

[ 
    { 
     "A": 7, 
     "B": 8, 
    }, 
    { 
     "A": 7, 
     "B": 8, 
    }, 
    { 
     "A": 7, 
     "B": 8, 
    }, 
]; 

fiddle

let data = [ 
    { 
     "X": 1, 
     "Y": 2, 
     "Z": 3, 
    }, 
    { 
     "X": 4, 
     "Y": 5, 
     "Z": 6, 
    }, 
    { 
     "X": 7, 
     "Y": 8, 
     "Z": 9, 
    }, 
]; 

let keys = { 
    A: 'X', 
    B: 'Y', 
}; 
let keyChain = {}; 
let cleanedData = []; 

for (let key in keys) { 
    keyChain[key] = ''; 
} 

for (let i in data) { 
    cleanedData[i] = keyChain; 
    for (let key in keys) { 
     if (keys[key] in data[i]) { 
      cleanedData[i][key] = data[i][keys[key]]; 
     }; 
    } 
} 
console.log(cleanedData); 
+1

他可能意味着硬編碼 - ))或手動輸入 – marmeladze

+1

@Chad你想要的輸出是什麼?最後你想看到什麼? – marmeladze

+1

謝謝,更新! – Chad

回答

1

的代碼的最後一部分就變成那麼下面就可以實現

for (let i in data) { 
    cleanedData[i] ={} 
    for (let key in keys) { 
     if (keys[key] in data[i]) { 
      cleanedData[i][key] = data[i][keys[key]]; 
     }; 
    } 
} 
console.log(cleanedData); 

let data = [ 
 
    { 
 
     "X": 1, 
 
     "Y": 2, 
 
     "Z": 3, 
 
    }, 
 
    { 
 
     "X": 4, 
 
     "Y": 5, 
 
     "Z": 6, 
 
    }, 
 
    { 
 
     "X": 7, 
 
     "Y": 8, 
 
     "Z": 9, 
 
    }, 
 
]; 
 

 
let keys = { 
 
    A: 'X', 
 
    B: 'Y', 
 
}; 
 
let keyChain = {}; 
 
let cleanedData = []; 
 

 
// construct the placeholder key value pair array 
 
for (let key in keys) { 
 
    keyChain[key] = ''; 
 
} 
 

 
// check keys to see if there's a match with the json 
 
for (let i in data) { 
 
    cleanedData[i] ={} 
 
    for (let key in keys) { 
 
     if (keys[key] in data[i]) { 
 
      cleanedData[i][key] = data[i][keys[key]]; 
 
     }; 
 
    } 
 
} 
 
console.log(cleanedData);

希望它可以幫助

+0

是的,是的,謝謝! – Chad

1

那是因爲你重複使用相同的keyChain對象作爲新的佔位符,所以這是同一個對象。您需要創建一個新的每次:

cleanedData[i] = { ...keyChain }; // instead of cleanedData[i] = keyChain; 

Fiddle

0
const data = [ 
    { 
     "X": 1, 
     "Y": 2, 
     "Z": 3, 
    }, 
    { 
     "X": 4, 
     "Y": 5, 
     "Z": 6, 
    }, 
    { 
     "X": 7, 
     "Y": 8, 
     "Z": 9, 
    }, 
]; 

const keys = { 
    A: 'X', 
    B: 'Y', 
}; 

let keysReMap = {}; 
for (var [key, value] of Object.entries(obj)) { 
    keysReMap[value] = key; 
} 

const cleanedData = data.map((val, key) => { 
    const newKey = keysReMap[key]; 
    return { 
     [newKey]: val 
    }; 
}); 
1

恕我直言,你錯過了什麼是鑰匙串對象使用相同的每個cleanedData數組元素。你必須永遠記住,JavaScript使用引用對象,所以每一行:

cleanedData[i] = keyChain; // same object 
// ... 
cleanedData[i][key] = data[i][keys[key]]; 
// modify keyChain object attributes 

你,在結果,相同的對象和值引用數組是最後一次修改。

嘗試使用類似(ES5方式):

cleanedData[i] = new Object(); // new object 
1

它比預期的方式更容易解決。只需使用map即可。

let filteredData = data.map((item) => ({'A' : item.X, 'B' : item.Y})); 

你每次都簡單地映射每個項目的element.XAelement.YB到一個新的對象。

let data = [ 
 
    { 
 
     "X": 1, 
 
     "Y": 2, 
 
     "Z": 3, 
 
    }, 
 
    { 
 
     "X": 4, 
 
     "Y": 5, 
 
     "Z": 6, 
 
    }, 
 
    { 
 
     "X": 7, 
 
     "Y": 8, 
 
     "Z": 9, 
 
    }, 
 
]; 
 

 
let filteredData = data.map((item) => ({'A' : item.X, 'B' : item.Y})); 
 
console.log(filteredData);

上面的腳本需要1496412529493.929ms來完成,而在一個接受的答案需要1496412584210.4958ms這是有點慢。