Получение свойств массива, которые не являются индексными

#javascript

#javascript

Вопрос:

У меня есть массив, к которому прикреплены некоторые свойства, подобные этому:

     let arVar = [[{a: 1, b:2},{c:3, d:4}, {e:5}]]
     arVar.item_id = "9";
     arVar.type_id = "1";
  

v является arVar в моем коде ниже массивом внутри ledgerTransactionsArray . v обладает свойствами, которые мне нужны, чтобы я мог добавить его в новый v .

Я не знаю, какие или сколько свойств v может иметь, и будет ли у него вообще какое-либо свойство

Я хочу получить arVar.type_id и arVar.item_id отдельно, чтобы я мог присоединить их к другому массиву:

 $scope.ledgerTransactionsArray = $scope.ledgerTransactionsArray.map(function(v) {
//v is the array with properties that i need to attach to new v
//v has item_id, type_id
      if (Array.isArray(v)) {
        console.log(v, "typeidcheck");
        v = v.map(function(subArrayObj) {

          for (let key in subArrayObj) {
            if (
              key == "credit_amount" || key == "debit_amount" ||
              key == "credit_total" || key == "debit_total"
            ) {
              if (subArrayObj[key]) {
                subArrayObj[key] = parseFloat(subArrayObj[key]).toLocaleString(undefined, {
                  maximumFractionDigits: 2,
                  minimumFractionDigits: 2
                });

              }
            }
          }

          return subArrayObj;
        })
      }
    })
  

Комментарии:

1. Вместо того, чтобы делать v = v.map() , используйте forEach . Таким образом, вам не нужно переназначать нецелочисленные ключи обратно в новый массив, возвращенный из map

2. @adiga да .. ты прав. Спасибо

Ответ №1:

Никакой магии. Просто используйте Object.keys . Это работает даже для массивов.

 > let arVar = [[{a: 1, b:2},{c:3, d:4}, {e:5}]]
> arVar.item_id = "9";
'9'
> arVar.type_id = "1";
'1'
> Object.keys(arVar)
[ '0', 'item_id', 'type_id' ]
  

Если вам нужно удалить числовые индексы, как '0' грубый взлом (не рекомендуется) будет:

 > Object.keys(arVar).filter(k => !/d /.test(k))
[ 'item_id', 'type_id' ]
  

или лучше, как указывает Nisarg:

 > Object.keys(arVar).filter(k => isNaN(k))
[ 'item_id', 'type_id' ]