0

ajv を使用して、配列が有効な値に関する厳密な規則に準拠していることを保証しようとしています。探している結果を得るためにどのような変更や追加のキーワードを使用すればよいかわかりません。いくつかの洞察を使用できます。

注:JSONSchema検証を使用せずに、これを別の方法で機能させています。JSONSchema 検証を使用して同じ目標を達成できるかどうか、ただ興味がありました。

ルールは次のとおりです。

  1. 任意の数の項目を含めることができます。インデックス 0 と 1 のみを考慮します。
  2. 最初の項目であるインデックス 0 は文字列でなければなりません。
  3. 2 番目の項目であるインデックス 1 は、オブジェクトでなければなりません。
  4. 配列の長さに関係なく、インデックス 0 または 1 の項目がいずれかのインデックスに対して有効な場合は、適切なインデックスで他の項目の既定値を挿入します。
  5. 配列にアイテムがない場合は、両方のデフォルト値を適切なインデックスに挿入します。

これは、私が達成しようとしていることをうまく説明するコード スニペットです。ありがとう。

const schema = {
    "type": "array",
    "items": [
        {
            "type": "string",
            "default": ""
        },
        {
            "type": "object",
            "default": {}
        }
    ]
};

function fn( array ) {

    ajv.validate( schema, array );
    console.log( array );

}

fn([]);
fn([ '1' ]);
fn([ { bar: 2} ]);
fn([ 'word', { foo: 3 } ]);
fn([ 'word', 42 ]);
fn([ [ 1, 2, 3 ],  { baz: 4 } ]);
fn([ 'word', { a: 1, b: 2 }, 42 ]);

// Actual results:

// [ '', {} ] => Expected
// [ '1', {} ] => Expected
// [ { bar: 2 }, {} ] => Not what I want
// [ 'word', { foo: 3 } ] => Expected
// [ 'word', 42 ] => Not what I want
// [ [ 1, 2, 3 ], { baz: 4 } ] => Not what I want
// [ 'word', { a: 1, b: 2 }, 42 ] => Expected, indices 0 and 1 are all I care about

// Desired results:

// [ '', {} ]
// [ '1', {} ]
// [ '1', { bar: 2 } ]
// [ 'word', { foo: 3 } ]
// [ 'word', {} ]
// [ '', { baz: 4 } ]
// [ 'word', { a: 1, b: 2 }, 42 ]
4

1 に答える 1