Умный массив фильтрации JS

У меня есть очень интересное задание, но я получаю плохой код. Это мутирует исходный массив, который я хочу избежать.

Вот пример массива:

[
{
ID: "some id",
NAME: "some name",
PROPERTIES:
    [
        {
            TYPE: [{UF_NAME: "some type name"}]
        },
        {
            OTHER_TYPE:
                [
                    {UF_NAME: "some other type name"},
                    {UF_NAME: "some other type name"},
                ]
        },
        ...
    ],
...
OFFERS:
    [
        {
            ID: "some id",
            NAME: "some name",
            PROPERTIES:
                [
                    {
                        SIZE: [{UF_NAME: "some type name"}]
                    },
                    {
                        COLOR:
                            [
                                {UF_NAME: "some color 1"},
                                {UF_NAME: "some color 2"},
                            ]
                    },
                    ...
                ],
        },
        {
            ID: "some id",
            NAME: "some name",
            PROPERTIES:
                [

                ]
        },
        ...
    ]
},
...

]

Вот результат, который я собираюсь достичь без изменения исходного массива:

[
{
ID: "some id",
NAME: "some name",
PROPERTIES:
    [
        {
            TYPE: [{UF_NAME: "some type name"}]
        },
        {
            OTHER_TYPE:
                [
                    {UF_NAME: "some other type name"},
                    {UF_NAME: "some other type name"},
                ]
        },
        ...
    ],
...
OFFERS:
    [
        {
            ID: "some id",
            NAME: "some name",
            PROPERTIES:
                [
                    {
                        SIZE: [{UF_NAME: "some type name"}]
                    },
                    {
                        COLOR:
                            [
                                {UF_NAME: "some color 1"},
                                {UF_NAME: "some color 2"},
                            ]
                    },
                    ...
                ],
        }
    ]
}

]

Какой фильтр должен делать:

  1. Просматривать весь массив поиска значений в свойствах объекта и предлагает свойства
  2. Вернуть новую копию исходного массива с отфильтрованными предложениями

Структура массива:

Продукт 1 - Предложение 11 - Предложение 12 - Предложение 13

Продукт 2 - Предложение 21 - Предложение 22 - Предложение 23

Продукт 3 - Предложение 31 - Предложение 32 - Предложение 33

Структура фильтрованного массива:

Продукт 1 - Предложение 11

Продукт 2 - Предложение 23

Продукт 3 - Предложение 31

Вот моя функция:

function filter (array, filter) {
        return array.filter(function iter(o) {
            return Object.keys(o).some(function (k) {
                if (typeof o[k] === 'string' && o[k].indexOf(filter) !== -1) {
                    return true
                }
                if (Array.isArray(o[k])) {
                    o[k] = o[k].filter(iter)
                    return o[k].length
                }
            })
        })
    }

Всего 1 ответ


Вам нужно переписать код, чтобы избежать подгонки с помощью вложенного фильтра и переназначения свойств.

Эта функция уменьшает массив и проверяет свойства, если найдено требуемое свойство, новое свойство добавляется во временный объект, а затем передается в результирующий набор.

То же самое касается вложенных массивов, они также уменьшены из-за возможной вложенной структуры.

function filter(array, filter) {
    return array.reduce(function iter(r, o) {
        var temp = {};

        Object.keys(o).forEach(function (k) {
            if (typeof o[k] === 'string' && o[k].indexOf(filter) !== -1) {
                temp[k] = o[k];
            } else if (Array.isArray(o[k])) {
                var filtered = o[k].reduce(iter, []);
                if (filtered.length) temp[k] = filtered;
            }
        });

        if (Object.keys(temp).length) r.push(temp);

        return r;
    }, []);
}

Есть идеи?

10000