The issue with your current solution is that you're not using .filter correctly. .filter expects its passed function to return a boolean. If true is returned, the current element will be kept in the newly generated array. If it is false, the current element will be omitted. So, instead of trying to remove the element from test_arr using .splice, use .filter to decide what stays and what gets removed.
Also, note that in your example v is referring to a given element (a particular object) in your test_array. Thus, you do not need to target index 0 of your object, but rather you need to get the id of the current object.
var test_arr = [{"name":"qqq", "city":"it","id":"123456"}, {"name":"ggg", "city":"uk","id":"777456"}];
test_arr = test_arr.filter(function(elem) {
return elem.id !== '123456';
});
console.log(test_arr); // [{"name": "ggg", "city": "uk", "id": "777456"}]
If you want a "cleaner" solution you can use an arrow function with destructing assignment:
test_arr = test_arr.filter(({id}) => id !== '123456'); // [{"name": "ggg", "city": "uk", "id": "777456"}]
var test_arr = [{"name":"qqq", "city":"it","id":"123456"}, {"name":"ggg", "city":"uk","id":"777456"}];
test_arr = test_arr.filter(({id}) => id !== '123456'); // [{"name": "ggg", "city": "uk", "id": "777456"}]
console.log(test_arr);
var result = test_arr.filter(v => v.id !== '123456' )