Kei05
@Kei05

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

配列の中の各オブジェクトに同じ値があるかをチェックしたい

Q&A

Closed

下記のような配列の中にオブジェクトが入ったデータがある時、textの値がすべて同じだったらtrue、1つでも違ったらfalseになるような条件を書きたいのですがどのように書けばいいかわからず教えていただきたいです。

const data = [
  {
    "text": "apple",
    "key": "value1"
  },
  {
    "text": "apple",
    "key": "value1"
  },
  {
    "text": "apple",
    "key": "value1"
  }
]
0

2Answer

dataのサイズが0の場合、trueとして問題ないなら以下のみで判定可能です。(dataが未定義だったり、nullだったりは考慮しません。)
data.every(x => x.text === data[0].text);
Array.everyは要素内のすべてが条件を満たしていればtrueを返します。
条件を「0番地のtextと、各要素のtextが同じである」としてあげれば判定できます。

4Like

Comments

  1. @Kei05

    Questioner

    ありがとうございます!
    ご教示いただいた方法で実装できました。
    every自体は調べていたのですが、使い方が理解できておらず今回このように使用できるとわかってよかったです。

思いつく限りでいろんなパターンで実装してみました。
ご参考にしてください。

■for文を利用した実装

最初のtextの値を保持しておいて、for文を利用して1つずつ最初のtextと同じかどうか比較することで実装しています。

function IsAllSameText(data){
    if (data.length==0) {
        return true;
    }
    
    let returnValue = true;
    const firstText = data[0]["text"];
    
    for (var i = 1; i < data.length; i++) {
        if (firstText != data[i]["text"]) {
            returnValue = false;
            break;
        }
    }
    
    return returnValue;
}

■filterを利用した実装

filterを利用して最初のテキストと同じものを抜き出して、その配列のサイズともとのdataのサイズが同じかどうかで実装しています。

function IsAllSameText(data){
    if (data.length==0) {
        return true;
    }
    
    const firstText = data[0]["text"];
    return data.filter(x => x["text"] == firstText).length == data.length;
}

filterを利用した個所では以下のような配列が返ってきています。

const data = [
  {
    "text": "apple",
    "key": "value1"
  },
  {
    "text": "banana",
    "key": "value2"
  },
  {
    "text": "apple",
    "key": "value3"
  }
]

const firstText = data[0]["text"];
console.log(data.filter(x => x["text"] == firstText))
// [ { text: 'apple', key: 'value1' }, { text: 'apple', key: 'value3' } ]
■setを利用した実装

mapを利用してtextの値のみの配列を作成して、setを利用して重複する値を削除することで実装しています。

function IsAllSameText(data){
    if (data.length==0) {
        return true;
    }
    
    const textList = data.map(x => x["text"]);
    return (new Set(textList)).size == 1;
}

mapを利用している箇所、setを利用している箇所ではそれぞれ以下のような形になっています。

const data = [
  {
    "text": "apple",
    "key": "value1"
  },
  {
    "text": "banana",
    "key": "value2"
  },
  {
    "text": "apple",
    "key": "value3"
  }
]

const textList = data.map(x => x["text"]);
console.log(textList)
// [ 'apple', 'banana', 'apple' ]

console.log(new Set(textList))
// Set(2) { 'apple', 'banana' }

念のためdataのサイズが0の場合はtrueとしております。
適宜修正してご利用ください。

また、データが多くなってくる場合は計算量も考慮する必要が出てくると思います。
計算量は比較していないので、データが多くなってくる場合は計算量も考慮したうえで、どのやり方がいいか選んで実装してみてください。

1Like

Comments

  1. @h_kono0707さん
    everyメソッド知らなかったです…。
    一番スマートなやり方ですね。勉強になりました!
  2. @Kei05

    Questioner

    様々なパターンでご意見くださりありがとうございます!
    後学の参考とさせていただきます。
    everyには驚きましたね。。とても便利です!

Your answer might help someone💌