ike81818
@ike81818

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

連想配列の要素を変更したい

解決したいこと

let obj={a:["a1","a2","a3"],b:["b1","b2","b3"]}

というオブジェクトがあるとして、
各要素の配列を先頭から、2つ抜き出して、

let obj={a:["a1","a2"],b:["b1","b2"]}

というふうに変換したいです。

配列については、
arr=["a1","a2","a3"]
newArr = arr.slice(0,2)
とすれば、["a1,"a2"]になると思うのですが、

上記のようなオブジェクトの中身を修正する方法がわかりません。

現在、上記のような値をReactのstateとして利用しているため、
javaScriptでの記述方法を教えていただければ幸いです。

1

3Answer

length を 2 にする手もありますね。

let obj={a:["a1","a2","a3"],b:["b1","b2","b3"]};

for (key in obj) {
    obj[key].length = 2
}

console.log(obj); // { a: [ 'a1', 'a2' ], b: [ 'b1', 'b2' ] }

1行で。

let obj={a:["a1","a2","a3"],b:["b1","b2","b3"]};

Object.keys(obj).forEach(key => obj[key].length = 2);

console.log(obj); // { a: [ 'a1', 'a2' ], b: [ 'b1', 'b2' ] }
2Like

Comments

  1. @ike81818

    Questioner

    ご回答ありがとうございます。
    for (key in obj) {
    obj[key].length = 2
    }
    がもっともシンプルだったので、採用させていただきました。

for...inでやってみました。

let obj={a:["a1","a2","a3"],b:["b1","b2","b3"]};

for (property in obj) {
    obj[property] = obj[property].slice(0,2);
}

console.log(obj); // { a: [ 'a1', 'a2' ], b: [ 'b1', 'b2' ] }

1Like

Comments

  1. @ike81818

    Questioner

    ご回答ありがとうございます。
    自分のプログラムにあてはめてみたところ、希望通りの動作を実現できました。
    このようなことを、サッと知識から取り出してこられることに感服いたします。

多分やり方はありますが、オブジェクトの中のオブジェクトと言う事も少しは考慮しないとだめかも知れません。

spliceの場合

既存の要素を取り除いたり、置き換えたり、新しい要素を追加したりすることで、配列の内容を変更します。

const obj = { a: ["a1", "a2", "a3"], b: ["b1", "b2", "b3"] };

Object.entries(obj).forEach(([key, values]) => {
  // 配列オブジェクトの要素を直接削るので、シンプルにこれでいける
  values.splice(2, values.length - 2)
})

console.log(obj);

sliceの場合

選択された配列の一部の浅いコピーを新しい配列オブジェクトに作成して返します

const obj = { a: ["a1", "a2", "a3"], b: ["b1", "b2", "b3"] };

Object.entries(obj).forEach(([key, values]) => {
  // コピーを作るので、新たに同要素の値として設定し直さないといけない
  obj[key] = values.slice(0, 2)
})

console.log(obj);
1Like

Comments

  1. @ike81818

    Questioner

    2つも事例を提示していただき、ありがとうございます。
    自分のプログラムにあてはめて動作を確認しようと思います。
    今後のことも考え、いろんな方法の知識を得られることを非常に嬉しく思います。

Your answer might help someone💌