Loda sh Фильтр Array и Get Parent Index - PullRequest
1 голос
/ 17 апреля 2020

My Api возвращает это в json формате

[
   {
      "title":"Category One",
      "data":[
         {
            "id":"5",
            "code":"0001",
            "name":"Item Name"
         },
         {
            "id":"6",
            "code":"0002",
            "name":"Item Name 2"
         }
      ]
   },
   {
      "title":"Category Two",
      "data":[
         {
            "id":"7",
            "code":"0003",
            "name":"Item Name 3"
         },
         {
            "id":"8",
            "code":"0004",
            "name":"Item Name 4"
         }
      ]
   }
]

Я хочу отфильтровать указанный массив по идентификатору. Я пробовал это так:

_.filter(data, ["title.data.id", "5"]);

Но возвращает пустой массив, затем Я также попробовал это так:

_.filter(data, { data: [{ id: "5" }] });

Но возвращает полный массив.

Пожалуйста, укажите, что мне здесь не хватает.

Ответы [ 4 ]

2 голосов
/ 17 апреля 2020

Вам нужно взять нужные свойства и перебрать и внутренний массив.

var data = [{ title: "Category One", data: [{ id: "5", code: "0001", name: "Item Name" }, { id: "6", code: "0002", name: "Item Name 2" }] }, { title: "Category Two", data: [{ id: "7", code: "0003", name: "Item Name 3" }, { id: "8", code: "0004", name: "Item Name 4" }] }],
    result = _.filter(data, ({ data }) => _.some(data, ({ id }) => id === "5"));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
1 голос
/ 17 апреля 2020

let obj = [
    {
        "title": "Category One",
        "data": [
            {
                "id": "5",
                "code": "0001",
                "name": "Item Name"
            },
            {
                "id": "6",
                "code": "0002",
                "name": "Item Name 2"
            }
        ]
    },
    {
        "title": "Category Two",
        "data": [
            {
                "id": "7",
                "code": "0003",
                "name": "Item Name 3"
            },
            {
                "id": "8",
                "code": "0004",
                "name": "Item Name 4"
            }
        ]
    }
]

function getFilterResult(filterValue) {
    let result = {}
    for (let i = 0; i < obj.length; i++) {
        let data = obj[i]['data']
        let index = data.findIndex(da => da.id === filterValue)
        if (index > -1) {
            result['title'] = obj[i].title
            data[index]['name']="New Item" /* added the code for updating the Name filed */
            result['data'] = [data[index]]
        }
    }
    return result
}

let finalResult = getFilterResult("7")
console.log(finalResult)

Использование loda sh

let data = [
    {
        "title": "Category One",
        "data": [
            {
                "id": "5",
                "code": "0001",
                "name": "Item Name"
            },
            {
                "id": "6",
                "code": "0002",
                "name": "Item Name 2"
            }
        ]
    },
    {
        "title": "Category Two",
        "data": [
            {
                "id": "7",
                "code": "0003",
                "name": "Item Name 3"
            },
            {
                "id": "8",
                "code": "0004",
                "name": "Item Name 4"
            }
        ]
    }
];

var output = _.find(data, item => _.find(item.data, d => d.id === '7'));
output['data'][_.findIndex(output['data'], { id: '7' })]['name']= "New Item";
console.log(output)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
0 голосов
/ 17 апреля 2020

Вы можете сделать это с помощью Reduce и Filter

const data = [
  {
    title: 'Category One',
    data: [
      {
        id: '5',
        code: '0001',
        name: 'Item Name',
      },
      {
        id: '6',
        code: '0002',
        name: 'Item Name 2',
      },
    ],
  },
  {
    title: 'Category Two',
    data: [
      {
        id: '7',
        code: '0003',
        name: 'Item Name 3',
      },
      {
        id: '8',
        code: '0004',
        name: 'Item Name 4',
      },
    ],
  },
];

data.reduce((acc, curr) => {
  const val = curr.data.filter((d) => d.id == '5');
  if (val.length) acc = [...acc, ...val];

  return acc;
}, []);
0 голосов
/ 17 апреля 2020

Вот решение с простым JS

const data = [
   {
      "title":"Category One",
      "data":[
         {
            "id":"5",
            "code":"0001",
            "name":"Item Name"
         },
         {
            "id":"6",
            "code":"0002",
            "name":"Item Name 2"
         }
      ]
   },
   {
      "title":"Category Two",
      "data":[
         {
            "id":"7",
            "code":"0003",
            "name":"Item Name 3"
         },
         {
            "id":"8",
            "code":"0004",
            "name":"Item Name 4"
         }
      ]
   }
];

const requried = data.find(item => item.data.find(d => d.id === '5'));

console.log(requried);

Использование loda sh

const data = [
   {
      "title":"Category One",
      "data":[
         {
            "id":"5",
            "code":"0001",
            "name":"Item Name"
         },
         {
            "id":"6",
            "code":"0002",
            "name":"Item Name 2"
         }
      ]
   },
   {
      "title":"Category Two",
      "data":[
         {
            "id":"7",
            "code":"0003",
            "name":"Item Name 3"
         },
         {
            "id":"8",
            "code":"0004",
            "name":"Item Name 4"
         }
      ]
   }
];

const required = _.find(data, item => _.find(item.data, d => d.id === '5'));

console.log(required);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
...