こんにちは
ご質問に挙げられている beforeData
と afterData
との差分を、配列の各要素の差分も含めて取得するために、参考になりそうなコードがありましたので、以下それを回答します。
Reactで使えるコードは、以下のコメントで提示されています。
上記の関数 difference
を使って、 postData
を得るコードを試作したので、以下に挙げます。(※ひな形を create-react-app で作成しています。)
javascript
1import { transform, isEqual, isObject } from 'lodash';
2
35678
9function difference(object, base) {
10 return transform(object, (result, value, key) => {
11 if (!isEqual(value, base[key])) {
12 result[key] = isObject(value) && isObject(base[key]) ? difference(value, base[key]) : value;
13 }
14 });
15}
16
17export default difference;
18
src/App.js
JSX
1import React from 'react';
2import difference from './difference';
3
4class App extends React.Component {
5 render() {
6
7 const beforeData = {
8 a: 1,
9 b: 2,
10 c: [
11 {d: 3, e: 4, f: 5},
12 {g: 6, h: 7, i: 8}
13 ],
14 m: 9
15 };
16
17 const afterData = {
18 a: 1,
19 b: 12,
20 c: [
21 {d: 3, e: 4, f: 5},
22 {g: 16, h: 17, i: 8},
23 {j: 9, k: 10, l: 11}
24 ],
25 m: 12
26 };
27
28 const postData = difference(afterData, beforeData);
29
30 return (
31 <pre>
32 {JSON.stringify(postData, null, "\t")}
33 </pre>
34 );
35 }
36}
37
38export default App;
src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
ReactDOM.render(<App />, document.getElementById('root'));
public/index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<title>Q202169</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
package.json
json
1{
2 "name": "q202169",
3 "version": "1.0",
4 "private": true,
5 "dependencies": {
6 "lodash": "^4.17.15",
7 "react": "^16.8.6",
8 "react-dom": "^16.8.6",
9 "react-scripts": "3.0.1"
10 },
11 "scripts": {
12 "start": "react-scripts start"
13 },
14 "eslintConfig": {
15 "extends": "react-app"
16 },
17 "browserslist": {
18 "production": [
19 ">0.2%",
20 "not dead",
21 "not op_mini all"
22 ],
23 "development": [
24 "last 1 chrome version",
25 "last 1 firefox version",
26 "last 1 safari version"
27 ]
28 }
29}
30
差分をPOSTで送るとのことでしたので、上記の App では postData
をJSON にして表示しています。上記を yarn start
すると以下のように表示されました。
上記を見る限りでは望ましい結果になっているかと思います。(プロパティc
の配列の先頭要素は差分が無いので、 null
になっているのは妥当な結果と思われます)
私自身は difference
のコードをあまり精査しておりませんので、お使いになる場合は何パターンかテストされることをお勧めします。
以上、参考になれば幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。