在 Javascript 中使用部分字符串匹配过滤数组

时间:2021-02-15 23:40:11

标签: javascript node.js json

我有一个对象数组,其中我需要过滤的值被埋在一个长字符串中。数组看起来像:

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

因此,如果我想获取 value 包含 partnerId 的所有 parent_sku 对象,我该怎么做?

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

编辑:

认为这无关紧要,但从反应来看,似乎确实如此。这是完整的响应对象:

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

我将它传递给一个可重用的函数来过滤数组:

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

功能:

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');
   }
}

4 个答案:

答案 0 :(得分:0)

问题出在其他地方。您尝试过的代码应该可以用于查找值是否包含字符串 - 我已将其添加到下面的代码段中,您将看到它的工作原理。

问题在于您如何访问 datadata.value。错误消息明确指出它认为 data.value 为空。我们需要查看它周围的代码才能找出问题所在。在运行 data 函数之前,尝试仅通过日志记录来控制 includes 的值。

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

console.log('includes?', data.value.includes('parent_sku'));

答案 1 :(得分:0)

您可以按照您的建议使用 const path = require('path') const fs = require('fs') const app = require('express')() const cacheMap = new Map() app.get('/thumb/:index', async function (req, res) { const { index } = req.params if (!index) return res.status(404).send() const jpeg = path.join(__dirname, 'thumbs', `${index}.jpg`) if (!cacheMap.has(index)) { console.log('reading file', jpeg) cacheMap.set(index, await fs.promises.readFile(jpeg)) } console.log({ index }) return res .header('content-type', 'image/jpeg') .status(200) .send(cacheMap.get(index)) }) 。这里的问题是您的对象嵌套在一个未命名的对象中。

试试:

data.value.includes('parent_sku')

答案 2 :(得分:0)

问题是 Observable<KeyboardEvent> 的某些值是 value。添加一个额外的条件修复它:

null

答案 3 :(得分:0)

使用 lodash 包含和 lodash 过滤器之类的

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/

相关问题