質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
React Native

React Nativeは、ネイティブモバイルアプリ(iOS/Android)を作成できるJavaScriptフレームワークです。Reactと同じ設計のため、宣言的なコンポーネントでリッチなUIを開発することが可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

2回答

2799閲覧

【連想配列】要素と値の効率的な追加・削除の方法

tomaa

総合スコア84

React Native

React Nativeは、ネイティブモバイルアプリ(iOS/Android)を作成できるJavaScriptフレームワークです。Reactと同じ設計のため、宣言的なコンポーネントでリッチなUIを開発することが可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/08/08 04:20

編集2020/08/08 06:41

JavaScriptを利用したコードを作成しています。

連想配列を使って、Keyやvalueを追加、削除する動きをさせているのですが、効率的な動作の書き方がわからず質問させてもらいます。

目的の動きは以下のとおりです。
①:要素数5つの連想配列(key 数字 : value String)を作る。
②:あるkeyを指定して、その要素のvalueを削除
③:②で指定されたKey以降のvalueがスライドする形で削除された値となる
④:最後の要素がKey、value共に削除される

イメージ説明

最大の要素数は5つなので、力わざでそれぞれのKeyの番号に対するコードを作成する方法もありますが、効率的ではないので良い方法を知りたいです。

良い方法ご存知の方おりましたら、ご教授いただけないでしょうか?


下記のコードは2のKeyを削除する内容ですが、それぞれのKeyによって削除、追加するようにしたいです。

JS

1import React from "react"; 2import { View, Button } from "react-native"; 3 4export default function TestArray() { 5 let array = { 6 0: "0番目", 7 1: "1番目", 8 2: "2番目", 9 3: "3番目", 10 4: "4番目", 11 }; 12 let lastNum = Object.keys(array).length; 13 14 console.log("-----Init------"); 15 for (var key in array) { 16 console.log(key + ":" + array[key]); 17 } 18 19 function handleDelete() { 20 console.log("-----Delete------"); 21 22 let targetKey = 2; 23 24 if (targetKey != lastNum - 1) { 25 delete array[targetKey]; 26 array[targetKey] = array[targetKey + 1]; 27 array[targetKey + 1] = array[targetKey + 2]; 28 delete array[lastNum - 1]; 29 } else { 30 delete array[lastNum - 1]; 31 } 32 for (var key in array) { 33 console.log(key + ":" + array[key]); 34 } 35 } 36 return ( 37 <View> 38 <Button 39 title="削除" 40 onPress={() => { 41 handleDelete(); 42 }} 43 /> 44 </View> 45 ); 46} 47

追記①

JS

1import React, { useState } from "react"; 2import { View, Button, Text } from "react-native"; 3import { TextInput } from "react-native-gesture-handler"; 4 5function Item({ setText, handleMakeNew, handleDelete, i }) { 6 return ( 7 <View> 8 <Text>{i}</Text> 9 <TextInput 10 onChange={(e) => { 11 setText(i, e.nativeEvent.text); 12 }} 13 /> 14 <View> 15 <Button 16 title="追加" 17 onPress={() => { 18 handleMakeNew(); 19 }} 20 /> 21 <Button 22 title="削除" 23 onPress={() => { 24 handleDelete(); 25 }} 26 /> 27 </View> 28 </View> 29 ); 30} 31 32export default function TestListItem() { 33 const [count, setCount] = useState(1); 34 const [texts, setTexts] = useState({}); 35 36 function handleMakeNew() { 37 setCount((v) => v + 1); 38 } 39 function handleDelete() { //①ここで連想配列の要素を削除 40 setCount((v) => v - 1); 41 42 } 43 return ( 44 <View> 45 <Text>{JSON.stringify(texts)}</Text> 46 {[...Array(count).keys()].map((i) => ( 47 <Item 48 handleMakeNew={handleMakeNew} 49 handleDelete={handleDelete} 50 setText={(i, text) => setTexts((prev) => ({ ...prev, [i]: text }))} 51 key={i} 52 i={i} 53 /> 54 ))} 55 </View> 56 ); 57} 58

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/08/08 04:59

キーが数値の連想配列で書いていますが、単なる配列を使えない事情があるのでしょうか?
tomaa

2020/08/08 05:04

コメントありがとうございます。 すでに作成したコードが、連想配列の利用をベースにしているため、連想配列での動きにしたいという状況です。 効率的なコードの作成が難しい場合は、通常の配列での対応も考えたいと思います。
maisumakun

2020/08/08 05:07

TestArray自体は通常の関数として呼び出す想定でしょうか、それともReactコンポーネントにするものでしょうか?
tomaa

2020/08/08 05:19

React初心者のため、正確な回答できないのですが、 https://codesandbox.io/s/tender-satoshi-37pe3?file=/src/App.js こちらのコードがベースになっています。 追加ボタンを押すとコンポーネントが追加され、連想配列も追加されます。 こちらのコードには削除ボタンがないですが、今回質問している内容で実装したいと思っています。
maisumakun

2020/08/08 05:38

> こちらのコードがベースになっています。 当該のコードへ、TestArrayをどこにどのような形で組み込むのかがわからないとなんとも言えません(呼び出し部分のコードはないのですか?)。
tomaa

2020/08/08 06:44

質問に追記を加えました。 TestArrayは、`const [texts, setTexts] = useState({});`の`texts`にあたります。 質問コードの`handleDelete`は、追記①の`handleDelete`にあたります。 意図していない回答であればすみません。
maisumakun

2020/08/08 06:51

えっと、TestArrayはサンプルとして提示しただけのコードで、そのまま使うコードではなかった、ということで間違いないですか?
tomaa

2020/08/08 06:56

はい、そうなります。 最終的には、連想配列の要素数が増減する中で、要素の変更をしたいです。 その前に、連想配列の要素数が固定した状態で、要素の削除と値の変更を試しましたが、その状態でもうまく動作しなかったので、その状態で質問させてもらっています。
tomaa

2020/08/08 07:00

> TestArray自体は通常の関数として呼び出す想定でしょうか、それともReactコンポーネントにするものでしょうか? こちらの質問に回答するためには、追記したコードでTestArrayの動きを説明するほうが、わかりやすいと思いました。 自分の見解では、「Reactコンポーネントにするもの」と考えています。
guest

回答2

0

そもそも論として、Reactの内部ではオブジェクトの変更をインスタンスの違いで認識して効率化するような仕組みが存在します。なので、「効率的な動作」をさせたいのであれば、それに乗っかる形で、変更のたびにオブジェクト全体を再作成してください

「オブジェクト操作の効率」より、「React側の動作効率」のほうが大きな問題です。

投稿2020/08/08 05:59

編集2020/08/08 06:02
maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/08/08 06:00

deleteや1つずつの代入での破壊的変更を直接行うことそのものが、Reactでの効率化を阻むこととなります。
tomaa

2020/08/08 06:45

ご回答ありがとうございます。 今は回答の内容を完全に理解できませんが、参考にさせてもらいこれからの開発に活かします。
guest

0

ベストアンサー

連想配列(連想記憶)は、キーと値のペア(要素)を保持するもので、ペアの順序については保証しません。
なので、2番目の要素とか、最後の要素とかいうものは有りません。
なので、連想配列の要素の順序は別途配列のようなデータの順序を持つもので乖離します。

キーが[o,1,2,3,4]である5つの要素を持つ連想記憶を作って、キーが2の要素を除いた表を作るのであれば、

・キーの配列[0,1,2,3,4]から、2を削除して、[0,1,3,4]に変更する。(連想配列に2をキーとする要素が残っていても、使わないので関係ない)
・"キーの配列から、キーを取り出し、そのキーの値を連想配列から得て、キーと値を表示する"という操作を繰り返す。

追加するのであれば、
・連想配列に登録されていないキーと値のペアを作って、連想配列に登録する。
・連想配列の登録したキーの値を、キーの配列の中に追加する。
・"キーの配列から、キーを取り出し、そのキーの値を連想配列から得て、キーと値を表示する"という操作を繰り返す。

キーが5の要素を連想配列に登録し、それを一番最初に表示したいのであれば
[0,1,3,4]というキーの配列の最初に5を追加して[5,0,1,3,4]にしてから、
・"キーの配列から、キーを取り出し、そのキーの値を連想配列から得て、キーと値を表示する"という操作を繰り返す。

というような感じです。

投稿2020/08/08 05:25

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tomaa

2020/08/08 06:50

ご回答いただきありがとうございます。 お陰様で連想配列の特性の知識が深まりました。 こちらの解説を参考に、コードの修正を行っていこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問