如何 return 两个数组与 Lodash 的交集数组?

How to return the array of intersection between two array with Lodash?

我正在尝试 return 所有相交数组元素的数组。

我有 2 个数组。

来自api的数组和过滤条件数组。

来自 api 的数组是这个

let somethingList = [
      {
        id: 'PROD108',
        name: 'Headsweats Mid Cap',
        CustomFields: [
          {
            name: 'Brand',
            value: 'Headsweats',
          },
          {
            name: 'Eco',
            value: 'False',
          },
          {
            name: 'Test',
            value: '0',
          },
        ],
      },
      {
        id: 'PROD109',
        name: 'Performance Liberty City Cycling Cap',
        CustomFields: [
          {
            name: 'Brand',
            value: 'Performance',
          },
          {
            name: 'Eco',
            value: 'False',
          },
          {
            name: 'Test',
            value: '0',
          },
        ],
      },
      {
        id: 'PROD110',
        name: 'Castelli Logo Bandana',
        CustomFields: [
          {
            name: 'Brand',
            value: 'Castelli',
          },
          {
            name: 'Eco',
            value: 'False',
          },
          {
            name: 'Test',
            value: '0',
          },
        ],
      },
      {
        id: 'PROD159',
        name: 'Performance Classic Sleeveless Jersey',
        CustomFields: [
          {
            name: 'Eco',
            value: 'False',
          },
          {
            name: 'Color',
            value: '#4CAF50',
          },
          {
            name: 'Test',
            value: '0',
          },
        ],
      },
      {
        id: 'PROD160',
        name: 'Schwinn Evolution IC Sleeveless Jersey',
        CustomFields: [
          {
            name: 'Brand',
            value: 'Schwinn',
          },
          {
            name: 'Eco',
            value: 'False',
          },
          {
            name: 'Color',
            value: '#2196F3',
          },
          {
            name: 'Test',
            value: '0',
          },
        ],
      },
      {
        id: 'PROD161',
        name: 'Performance Elite Short',
        CustomFields: [
          {
            name: 'Brand',
            value: 'Performance',
          },
          {
            name: 'Eco',
            value: 'False',
          },
          {
            name: 'Color',
            value: '#000000',
          },
          {
            name: 'Test',
            value: '0',
          },
        ],
      },
      {
        id: 'PROD162',
        name: 'Andiamo! Padded Cycling Brief',
        CustomFields: [
          {
            name: 'Eco',
            value: 'False',
          },
          {
            name: 'Color',
            value: '#808080',
          },
          {
            name: 'Test',
            value: '0',
          },
        ],
      },
      {
        id: 'PROD163',
        name: 'Fox Mojave Glove',
        CustomFields: [
          {
            name: 'Brand',
            value: 'Fox',
          },
          {
            name: 'Eco',
            value: 'False',
          },
          {
            name: 'Color',
            value: '#000000',
          },
          {
            name: 'Test',
            value: '0',
          },
        ],
      },
    ];

筛选条件数组。

 let testingFilter = ['Fox', 'Performance'];

我想做的是如果array from apicustomfield valuetestingFilter值相交

我想将它们推入一个数组,然后 return 那个新数组。

但是我写的代码没有return一个新数组,我应该如何return一个新数组

let filteredProduct = [];
    filteredProduct = _.filter(somethingList, (product) => {
      if (testingFilter.length === 0) {
        return somethingList;
      } else {
        // Here is the problem
        return _.intersection(testingFilter, _.map(product.CustomFields, 'value'));
      }
    });

预期答案数组

filteredProduct = [
{
        id: 'PROD109',
        name: 'Performance Liberty City Cycling Cap',
        CustomFields: [
          {
            name: 'Brand',
            value: 'Performance',
          },
          {
            name: 'Eco',
            value: 'False',
          },
          {
            name: 'Test',
            value: '0',
          },
        ],
      },
{
        id: 'PROD161',
        name: 'Performance Elite Short',
        CustomFields: [
          {
            name: 'Brand',
            value: 'Performance',
          },
          {
            name: 'Eco',
            value: 'False',
          },
          {
            name: 'Color',
            value: '#000000',
          },
          {
            name: 'Test',
            value: '0',
          },
        ],
      },
         {
            id: 'PROD163',
            name: 'Fox Mojave Glove',
            CustomFields: [
              {
                name: 'Brand',
                value: 'Fox',
              },
              {
                name: 'Eco',
                value: 'False',
              },
              {
                name: 'Color',
                value: '#000000',
              },
              {
                name: 'Test',
                value: '0',
              },
            ],
          },
]

以下行取自您的代码:

_.map(product.CustomFields, 'value')

在这里,你得到了 CustomFields 的所有 values 的数组,如果我们检查 if there is an item from testinFilter present in that array,我们可以将其用作 _filter return 语句如下:

let filteredProduct = [];
filteredProduct = _.filter(somethingList, (product) => {
    const allCustomFields = _.map(product.CustomFields, 'value');
    return allCustomFields.some(r => testingFilter.indexOf(r) >= 0);
});

// We could rewrite the same code as a one-liner without the extra const like so:
let filteredProduct = _.filter(somethingList, (product) => _.map(product.CustomFields, 'value').some(r => testingFilter.indexOf(r) >= 0));

片段

let testingFilter = ['Fox', 'Performance'];
let somethingList = [{id: 'PROD108', name: 'Headsweats Mid Cap', CustomFields: [{name: 'Brand', value: 'Headsweats', }, {name: 'Eco', value: 'False', }, {name: 'Test', value: '0', }, ], }, {id: 'PROD109', name: 'Performance Liberty City Cycling Cap', CustomFields: [{name: 'Brand', value: 'Performance', }, {name: 'Eco', value: 'False', }, {name: 'Test', value: '0', }, ], }, {id: 'PROD110', name: 'Castelli Logo Bandana', CustomFields: [{name: 'Brand', value: 'Castelli', }, {name: 'Eco', value: 'False', }, {name: 'Test', value: '0', }, ], }, {id: 'PROD159', name: 'Performance Classic Sleeveless Jersey', CustomFields: [{name: 'Eco', value: 'False', }, {name: 'Color', value: '#4CAF50', }, {name: 'Test', value: '0', }, ], }, {id: 'PROD160', name: 'Schwinn Evolution IC Sleeveless Jersey', CustomFields: [{name: 'Brand', value: 'Schwinn', }, {name: 'Eco', value: 'False', }, {name: 'Color', value: '#2196F3', }, {name: 'Test', value: '0', }, ], }, {id: 'PROD161', name: 'Performance Elite Short', CustomFields: [{name: 'Brand', value: 'Performance', }, {name: 'Eco', value: 'False', }, {name: 'Color', value: '#000000', }, {name: 'Test', value: '0', }, ], }, {id: 'PROD162', name: 'Andiamo! Padded Cycling Brief', CustomFields: [{name: 'Eco', value: 'False', }, {name: 'Color', value: '#808080', }, {name: 'Test', value: '0', }, ], }, {id: 'PROD163', name: 'Fox Mojave Glove', CustomFields: [{name: 'Brand', value: 'Fox', }, {name: 'Eco', value: 'False', }, {name: 'Color', value: '#000000', }, {name: 'Test', value: '0', }, ], }, ];

let filteredProduct = _.filter(somethingList, (product) => {
    const allCustomFields = _.map(product.CustomFields, 'value');
    return allCustomFields.some(r => testingFilter.indexOf(r) >= 0);
});
console.log(filteredProduct);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>

结果:

[
  {
    "id": "PROD109",
    "name": "Performance Liberty City Cycling Cap",
    "CustomFields": [
      {
        "name": "Brand",
        "value": "Performance"
      },
      {
        "name": "Eco",
        "value": "False"
      },
      {
        "name": "Test",
        "value": "0"
      }
    ]
  },
  {
    "id": "PROD161",
    "name": "Performance Elite Short",
    "CustomFields": [
      {
        "name": "Brand",
        "value": "Performance"
      },
      {
        "name": "Eco",
        "value": "False"
      },
      {
        "name": "Color",
        "value": "#000000"
      },
      {
        "name": "Test",
        "value": "0"
      }
    ]
  },
  {
    "id": "PROD163",
    "name": "Fox Mojave Glove",
    "CustomFields": [
      {
        "name": "Brand",
        "value": "Fox"
      },
      {
        "name": "Eco",
        "value": "False"
      },
      {
        "name": "Color",
        "value": "#000000"
      },
      {
        "name": "Test",
        "value": "0"
      }
    ]
  }
]

你可以这样做:

let somethingList = [ { id: 'PROD108', name: 'Headsweats Mid Cap', CustomFields: [ { name: 'Brand', value: 'Headsweats', }, { name: 'Eco', value: 'False', }, { name: 'Test', value: '0', }, ], }, { id: 'PROD109', name: 'Performance Liberty City Cycling Cap', CustomFields: [ { name: 'Brand', value: 'Performance', }, { name: 'Eco', value: 'False', }, { name: 'Test', value: '0', }, ], }, { id: 'PROD110', name: 'Castelli Logo Bandana', CustomFields: [ { name: 'Brand', value: 'Castelli', }, { name: 'Eco', value: 'False', }, { name: 'Test', value: '0', }, ], }, { id: 'PROD159', name: 'Performance Classic Sleeveless Jersey', CustomFields: [ { name: 'Eco', value: 'False', }, { name: 'Color', value: '#4CAF50', }, { name: 'Test', value: '0', }, ], }, { id: 'PROD160', name: 'Schwinn Evolution IC Sleeveless Jersey', CustomFields: [ { name: 'Brand', value: 'Schwinn', }, { name: 'Eco', value: 'False', }, { name: 'Color', value: '#2196F3', }, { name: 'Test', value: '0', }, ], }, { id: 'PROD161', name: 'Performance Elite Short', CustomFields: [ { name: 'Brand', value: 'Performance', }, { name: 'Eco', value: 'False', }, { name: 'Color', value: '#000000', }, { name: 'Test', value: '0', }, ], }, { id: 'PROD162', name: 'Andiamo! Padded Cycling Brief', CustomFields: [ { name: 'Eco', value: 'False', }, { name: 'Color', value: '#808080', }, { name: 'Test', value: '0', }, ], }, { id: 'PROD163', name: 'Fox Mojave Glove', CustomFields: [ { name: 'Brand', value: 'Fox', }, { name: 'Eco', value: 'False', }, { name: 'Color', value: '#000000', }, { name: 'Test', value: '0', }, ], }, ];
let testingFilter = ['Fox', 'Performance'];

let filteredProducts = somethingList.filter(p =>
    Array.from(p.CustomFields.values()) // iterable to array
        .map(({value}) => value) 
        .some(value => testingFilter.includes(value))) 

console.log(filteredProducts)