Как вернуть родительский объект путем фильтрации вложенного свойства - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь отфильтровать массив с вложенными объектами, но родительский объект не возвращается при фильтрации по дочернему свойству.

let line = "xyz";

let data = [
    {
        "header": {
            "po_no": "P.O. Number"
        },
        "line": line
    },
    {
        "header": {
            "po_no": "Another P.O. Number"
        },
        "line": line
    }
];

...

data.filter(item => { 
  return item.header.po_no === 'P.O. Number' // Evaluates to true
})

Я бы хотел вернуть все item, когда его header.po_no соответствует строке.

Я не уверен, как отлаживать это, поскольку он не возвращает никаких значений, когда возвращаемое условие оценивается как true.

Ожидаемый результат:

[{
  "header": {
    "po_no": "P.O. Number"
  },
  "line": line
}]

Как я могу вернуть весь индекс массива, когда под-свойство совпадает с использованием фильтра?

Ответы [ 3 ]

1 голос
/ 24 июня 2019

.filter возвращает new Array; это не изменяет массив. Так что, если вы ожидаете, что data будет иметь такой вывод, он не будет. Тем не менее, это будет:

const expectedItems = data.filter(item => { 
  return item.header.po_no === 'P.O. Number' // Evaluates to true
});
0 голосов
/ 24 июня 2019

Использование Array.filter с функцией стрелки решило бы это самым кратким образом.filter возвращает основной массив и отфильтрованные элементы, где find возвращает только определенный соответствующий элемент.

let line = "xyz";

let data = [{
    "header": { "po_no": "P.O. Number" },
    line
  },
  {
    "header": { "po_no": "Another P.O. Number" },
    line
  }
];

let filter = data.filter(d => d.header.po_no === 'P.O. Number') // return arr
let find = data.find(d => d.header.po_no === 'P.O. Number') // return just the item

console.log(filter)
console.log(find)

При работе с функциями стрелок и при прямом возврате вам не нужно открывать скобку функции ... просто сделайте:

data.filter(d => d.header.po_no === 'P.O. Number')  // <-- no { return ... }

Также обратите внимание, что поскольку ваше свойство называется line, вы можете просто определить свой объект как:

  {
    "header": { "po_no": "Another P.O. Number" },
    line  // <-- same prop name as your variable name
  }
0 голосов
/ 24 июня 2019

В вашем коде указан тип цитаты. отфильтрованные данные сохраняются в переменную.

let line = "xyz";

let data = [
  {
    "header": {
    "po_no": "P.O. Number"
    },
    "line": line
  }, 
  {
    "header": {
    "po_no": "Another P.O. Number"
  },
  "line": line
  }
];

const filtered = data.filter(item => { 
  return item.header.po_no === 'P.O. Number' // Evaluates to true
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...