У меня есть очень интересное задание, но я получаю плохой код. Это мутирует исходный массив, который я хочу избежать.
Вот пример массива:
[
{
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 - Предложение 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;
}, []);
}