There's a few issues here. Firstly the main problem is that you set i = 3 in your loop, so you start from the 4th element of the array, not the first.
Secondly the correct jQuery method is val(), not value(), and you need to chain that call with text() on the first append(), not create two separate option elements. Try this:
let data = {
names: ['John Doe', 'Jane Doe', 'Stephan Doe', 'Emily Doe']
}
// in your AJAX callback:
for (var i = 0; i < data.names.length; i++) {
$('#name').append($('<option></option>').text(data.names[i]).val(data.names[i]));
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="name"></select>
As an aside note that you can improve performance of the code by using map() to create an array of HTML strings to append to the DOM once instead of creating a brand new jQuery object which gets appended to the DOM in each iteration of the loop:
let data = {
names: ['John Doe', 'Jane Doe', 'Stephan Doe', 'Emily Doe']
}
// in your AJAX callback:
let options = data.names.map(n => `<option value="${n}">${n}</option>`);
$('#name').append(options);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="name"></select>
i=3so you are asking the for loop to skip the first 3 entries