n раз для каждого в angularjs - PullRequest
       0

n раз для каждого в angularjs

0 голосов
/ 01 ноября 2019
$scope.attrs_value = {color: ["red"], size: [45, 42], etc...}

У меня есть атрибуты-переменные и их возвращение из базы данных, поэтому он может иметь и другой ключ, например,

$scope.attrs_value = {color: ["red"], size: [45, 42], type: ["round"]}

Теперь мне нужен массив, например,

for(var data in $scope.attrs_value.color) {
 for(var input in $scope.attrs_value.size) {
  dataArray.push({
   color : $scope.attrs_value.color[data],
   size  : $scope.attrs_value.size[input],
   quantity : "",
   price : $scope.price
  });
 }
}

Итак, я предполагаю, что статический атрибут, такой как цвет и размер, необходим, чтобы он был динамическим, n количество раз, которое он будет создавать для цикла и построения массива.

Атрибуты по умолчанию будутбыть количеством, ценой, поэтому мы не учитываем это.

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

Результат будет похож на вид матрицы.

0: {color: "red", size: "45", quantity: "", price: "45"}
1: {color: "red", size: "42", quantity: "", price: "45"}

Если вставить два цвета (красный, синий) и два размера (42, 45), результат будет таким,

0: {color: "red", size: "45", quantity: "", price: "45"}
1: {color: "red", size: "42", quantity: "", price: "45"}
2: {color: "blue", size: "45", quantity: "", price: "45"}
3: {color: "blue", size: "42", quantity: "", price: "45"}

1 Ответ

0 голосов
/ 01 ноября 2019

Предыдущий ответ

Извините, если нет, но если я вас правильно понял, то вам нужен массив типа:

[
    {
        color: "red",
        size: 45,
        ...
    },
    {
        color: null,
        size: 42,
        ...
    },
    ...
]

Для этого, я думаю, я пойду с этим:

// easier to write... Sorry, I'm lazy xP
var attrs = $scope.attrs_value;
// the resultant array 
var newArr = [];
// the keys of your Object -> ["color", "size", "price"...]
var keys = Object.keys(attrs);
// length of the longest array in your Object
var maxLen = 0;

// get length of longest array
for (var k in keys) {
    if (attrs[k].length > maxLen)
        maxLen = attrs[k].length;
}

// create resultant array
for (var i = 0; i < maxLen; i++) {
    newArr.push({
        // accessing an element outside of the array
        // does NOT launch errors, it just returns
        // "undefined" value. If you want another default
        // value instead of null, place it here
        //
        // ex. -> attrs.position[i] || 0,

        color: attrs.color[i] || null,
        size: attrs.size[i] || null,
        ...
    })
}

Редактировать

Хорошо, так что если вы хотите что-то подобное.

[
    {color: "red", size: "45", quantity: "", price: "45"}
    {color: "red", size: "42", quantity: "", price: "45"}
    {color: "blue", size: "45", quantity: "", price: "45"}
    {color: "blue", size: "42", quantity: "", price: "45"}
]

Тогда еще проще! Попробуйте это:

var attrs = $scope.attrs_value;
var newArr = [];

attrs.color.forEach(function(c) {
    attrs.size.forEach(function(s) {
        newArr.push({
        color: c,
        size: s,
        ...
    })
    });
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...