#javascript #arrays
#javascript #массивы
Вопрос:
У меня есть некоторые данные, и мне нужно отфильтровать данные, которые являются нулевыми или пустыми, и создать новый список данных, который фильтруется.
В этом случае иногда массив «имен» равен нулю, поэтому мне нужны эти данные.
{
"people": [
{
"id": "2",
"description": "desc here",
"names": [
{
"name": "name here",
},
{
"name": "name here",
}
],
"other": "0"
},
{
"id": "200",
"description": "desc here",
"names": null
"other": "0"
},
{
"id": "64",
"description": "desc here",
"names": [
{
"name": "name here",
},
{
"name": "name here",
}
],
"other": "1"
}
]
}
Как я могу это сделать?
Ответ №1:
Вы можете рекурсивно перебирать массивы и объекты до тех пор, пока не будет найден примитив. Затем проверьте и верните значение.
function copy(object) {
var o;
if (Array.isArray(object)) {
return object.reduce(function (r, a) {
var v = copy(a);
v.names !== null amp;amp; v.names !== '' amp;amp; r.push(v);
return r;
}, []);
}
if (object !== null amp;amp; typeof object === 'object') {
o = {};
Object.keys(object).forEach(function (k) {
o[k] = copy(object[k]);
});
return o;
}
return object;
}
var data = { people: [{ id: "2", description: "desc here", names: [{ id: "345", name: "name here", }, { id: "54", name: "name here", foo: "", }], other: "0" }, { id: "2", description: "desc here", names: null, other: "0" }, { id: "64", description: "desc here", names: [{ id: "87", name: "name here", }, { id: "53", name: "name here", }], other: "1" }] },
result = copy(data);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Комментарии:
1. Это работает хорошо, но если имена = null в записи, мне нужно, чтобы вся запись была удалена из нового списка. Например .. в моих приведенных выше данных идентификатор записи 200 вообще не будет отображаться в новом массиве
Ответ №2:
var newArray = oldArray.filter(function(v){return v!==''});
Комментарии:
1. Вы должны добавить описание к своему ответу вместо того, чтобы просто публиковать одну строку кода, чтобы OP узнал, почему вы это рекомендуете, в противном случае это приводит к тому, что люди просто копируют и вставляют код, не понимая, что он делает.
Ответ №3:
new_array=yourObject.people.filter(function(elem){
return elem.names!==null amp;amp; elem.names!==""
});
Комментарии:
1. Кажется, это работает, но почему оно отображается в Chrome как Object, Object, Object, Object], а не как исходный объект {people: Array[16]} ?
2. После фильтрации кажется, что он меняется, а остальная часть кода выдает ошибки. Почему это больше не отображается так после фильтрации? Объект {люди: массив [16]} … теперь он выглядит так: объект, объект, объект, объект] … преобразован?
3. в консоли написано