Фильтр ключей по именам содержит строку

Я хотел бы фильтровать в myArray ключи по именам, содержащие строку «item» (все «item1», «item2», «item3» и т. д.)

const combined = myArray.map(e => Object.assign(e, MyArrayDefinition.find(k => k.item === e.item)));

Я пробовал это с .includes, но это не работает

const combined = myArray.map(e => Object.assign(e, MyArrayDefinition.find(k => k.includes('item') === e.item)));

Мои массивы

const myArray = [{
            "shop": "shop1",
            "item1": "my apple 1",
            "item2": "my carrot 1",

        },  {
            "shop": "shop2",
            "item1": "my apple 0",
            "item2": "my carrot 1",

        }, {
            "shop": "shop2",
            "item1": "my apple 1",
            "item2": "my carrot 0",

        }, ];

        const MyArrayDefinition = [ {
            "item": "my apple 0",
            "color": "red",
            "group": "my fruit",
            "score": 0
        }, {
            "item": "my carrot 1",
            "color": "orange",
            "group": "my vegetable",
            "score": 1
        }, {
            "item": "my apple 1",
            "color": "red",
            "group": "my fruit",
            "score": 1
        }, {
            "item": "my carrot 0",
            "color": "orange",
            "group": "my vegetable",
            "score": 0
        }];

пожалуйста, добавьте желаемый результат ...

Nina Scholz 11.06.2018 15:12

Вы сравниваете item1 с item или item2 с item?

Ivan 11.06.2018 15:27

что происходит с item2?

Nina Scholz 11.06.2018 15:28

Я сравниваю item1 и item2 с item, чтобы получить их цвета и их группы.

observatoire 11.06.2018 15:32

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

Nina Scholz 11.06.2018 15:33
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
577
3

Ответы 3

Что-то вроде:

const filtered = myArray.map((obj) => {
    const objKeys = Object.keys(obj);
    const result = objKeys.reduce((acc, k) => {
        if (k.match(/item/)) { // just keys withe "item"
            acc[k] = obj[k];
        }

        return acc;
    }, {});

    return result;
})

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

var array = [{ shop: "shop1", item1: "my apple 1", item2: "my carrot 1" }, { shop: "shop2", item1: "my apple 0", item2: "my carrot 1" }, { shop: "shop2", item1: "my apple 0", item2: "my carrot 0" }],
    definition = [{ item: "my apple 0", color: "red", group: "my fruit", score: 0 }, { item: "my carrot 1", color: "orange", group: "my vegetable", score: 1 }, { item: "my apple 1", color: "red", group: "my fruit", score: 1 }, { item: "my carrot 0", color: "orange", group: "my vegetable", score: 0 }],
    result = array.map(o => ({
        shop: o.shop,
        items: Object
            .keys(o)
            .filter(k => k.startsWith('item'))
            .map(k => definition.find(({ item }) => item === o[k]))
    }));

console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Большое спасибо за вашу помощь! но это многомерный объект. Мне нужен простой массив с объектами. Примерно так [{shop: "shop1", "item": "my apple 1", "color": "red", "group": "my fruit", "score": 1}, {shop: "shop1 "," item ":" мое яблоко 1 "," color ":" красный "," group ":" my fruit "," score ": 1} и т. д.]

observatoire 11.06.2018 18:45

какой предмет ты хочешь взять? item1 или item2?

Nina Scholz 11.06.2018 18:46

Я бы хотел забрать все вещи

observatoire 11.06.2018 18:48

а как должен выглядеть массив для первого объекта?

Nina Scholz 11.06.2018 19:03

каждый объект - это уникальный предмет + уникальный магазин, а оценка - это их сумма

observatoire 11.06.2018 19:09

Альтернативой является использование функции filter и функции includes для фильтрации этих объектов с помощью ключей === item и существующих с массивом MyArrayDefinition.

В этом примере есть следующий объект, значения которого не существуют в MyArrayDefinition:

{  
    "shop": "shop33",
    "item1": "my apple 33",  
    "item2": "my carrot 33"
}

const myArray = [{  "shop": "shop1",  "item1": "my apple 1 my fruit",  "item2": "my carrot 1",}, {  "shop": "shop2",  "item1": "my apple 0",  "item2": "my carrot 1",}, {  "shop": "shop2",  "item1": "my apple 0",  "item2": "my carrot 0",}, {  "shop": "shop33",  "item1": "my apple 33",  "item2": "my carrot 33",}],
      MyArrayDefinition = [{  "item": "my apple 0",  "color": "red",  "group": "my fruit",  "score": 0}, {  "item": "my carrot 1",  "color": "orange",  "group": "my vegetable",  "score": 1}, {  "item": "my apple 1",  "color": "red",  "group": "my fruit",  "score": 1}, {  "item": "my carrot 0",  "color": "orange",  "group": "my vegetable",  "score": 0}],
      mappedItems = MyArrayDefinition.map(({item}) => item), // convert to an array with only values from item.
      result = myArray.filter(o => Object.keys(o).some(k => k.includes('item') && mappedItems.includes(o[k]))); // get the object with at least one key === item and which value exists within mappedItems.

console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Другие вопросы по теме