简体   繁体   中英

Filter Array Using Partial String Match in Javascript

I have an array of objects where the value I need to filter on is buried in a long string. Array looks like:

                          {
                            "data": {
                              "value": "{\"cols\":[\"parent_sku\"],\"label\":\"Style\",\"description\":\"Enter Style.\",\"placeholderText\":\"Style 10110120103\"}",
                              "partnerId": 1
                            }
                          },

So if I wanted to grab all the partnerId objects where value includes parent_sku how would I do that?

console.log(data.value.includes('parent_sku') returns cannot read property 'includes' of null .

EDIT:

Didn't think this mattered, but judging by responses, seems it does. Here's the full response object:

 Response body: {
                      "data": {
                        "configurationByCode": [
                          {
                            "data": {
                              "value": "{\"cols\":[\"parent_sku\"],\"label\":\"Style\",\"description\":\"Enter Style.\",\"placeholderText\":\"Style 10110120103\"}",
                              "partnerId": 1
                            }
                          }

I'm passing that into a re-usable function for filtering arrays:

const parentSkuPartners = filterArray(res.body.data.configurationByCode, 'parent_sku');

Function:

function filterArray(array, filterList) {
  const newList = [];
  for (let i = 0; i < array.length; i += 1) {
    console.log('LOG', array[i].data.value.includes('parent_sku');
   }
}

The problem is somewhere else. The code you've tried should work to find if a value contains a string – I've added it the snippet below and you'll see it works.

The issue is how you are accessing data and data.value . The error message clearly states that it believes that data.value is null. We would need to see the code around it to be able to figure out what the problem is. Try just logging to console the value of data before you run the includes function.

 const data = { "value": "{\"cols\":[\"parent_sku\"],\"label\":\"Style\",\"description\":\"Enter Style.\",\"placeholderText\":\"Style 10110120103\"}", "partnerId": 1 }; console.log('includes?', data.value.includes('parent_sku'));

You can use data.value.includes('parent_sku') as you have suggested. The issue here is that your object is nested inside an unnamed object.

try:

"data": {
    "value": "{\"cols\":[\"parent_sku\"],\"label\":\"Style\",\"description\":\"Enter Style.\",\"placeholderText\":\"Style 10110120103\"}",
    "partnerId": 1
}

The problem was some of the values for value were null . Adding an extra conditional fixed it:

if (array[i].data.value !== null) {

Use lodash includes, and lodash filter like

let configurationByCode = [{
    data: {
        value: {
            cols:["parent_sku"],
            label:"Style",
            description:"Enter Style.",
            placeholderText:"Style 10110120103"
        },
        "partnerId": 1
    }
}, {
    data: {
        value: {
            cols:["nothing"],
            label:"Style",
            description:"Enter Style.",
            placeholderText:"Style 10110120103"
        },
        "partnerId": 2
    }
}];

let wantedData =  _.filter(configurationByCode, (config) => { 
    return _.includes(config.data.value.cols, 'parent_sku'); 
});

console.log( wantedData );

https://jsfiddle.net/76cndsp2/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM