фильтр ключей по именам содержит строку - PullRequest
0 голосов
/ 11 июня 2018

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

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

Я пробовал это сВключает, но не работает

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
        }];

Ответы [ 3 ]

0 голосов
/ 11 июня 2018

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

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.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 11 июня 2018

Альтернативой является использование функции 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.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 11 июня 2018

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

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;
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...