Цикл Javascript и отфильтровывает нулевые или пустые данные

#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. в консоли написано