Перебирайте массив объектов JSON и получайте свойства на основе соответствующих идентификаторов объектов - PullRequest
0 голосов
/ 11 декабря 2018

Моя цель, если идентификатор из digital_assets и продуктов совпадает, получить значение URL для digital_assets и ProductName из объекта products.Я могу пройти через объект и получить значения digital_assets и продуктов, но мне нужна некоторая помощь для сравнения этих двух объектов на основе идентификаторов, чтобы получить значения URL и ProductName.Вот что я сделал до сих пор:

var data = [{
        "digital_assets": [{
            "id": "AA001",
            "url": "https://via.placeholder.com/150"
        },{
            "id": "AA002",
            "url": "https://via.placeholder.com/150"
        }]
    }, {
        "products": [{
            "id": ["BB001", "AA001"],
            "ProductName": "PROD 485"
        },{
            "id": ["BB002", "AA002"],
            "ProductName": "PROD 555"
        }]
    }
];

$.each(data, function () {
    var data = this;
    //console.log(data);

    $.each(data.digital_assets, function () {
        var dAssets = this,
            id = dAssets['id'];
        // console.log(id);
    });

    $.each(data.products, function () {
        var proData = this,
            prod_id = proData['id'];
        // console.log(prod_id);

        $.each(prod_id, function () {
            var arr_id = this;
            console.log(arr_id);
        });
    });
});

Нужно ли создавать новые массивы и вставлять значения в новые массивы?Затем concat () эти массивы в один.?Бит потерян, любая помощь будет оценена.

Ответы [ 4 ]

0 голосов
/ 11 декабря 2018

https://jsfiddle.net/2b1zutvx/

с использованием карты.

 var myobj = data[0].digital_assets.map(function(x) {
    return {
        id: x.id,
        url: x.url,
        ProductName: data[1].products.filter(f => f.id.indexOf(x.id) > -1).map(m => m.ProductName)
    };
});
0 голосов
/ 11 декабря 2018

Вот один из способов сделать это через Array.reduce, Array.includes, Object.entries и Array.forEach:

var data = [{ "digital_assets": [{ "id": "AA001", "url": "https://via.placeholder.com/150" }, { "id": "AA002", "url": "https://via.placeholder.com/150" } ] }, { "products": [{ "id": ["BB001", "AA001"], "ProductName": "PROD 485" }, { "id": ["BB002", "AA002"], "ProductName": "PROD 555" } ] } ]

const result = data.reduce((r,c) => { 
  Object.entries(c).forEach(([k,v]) => 
    k == 'digital_assets' 
     ? v.forEach(({id, url}) => r[id] = ({ id, url }))
     : v.forEach(x => Object.keys(r).forEach(k => x.id.includes(k) 
       ? r[k].ProductName = x.ProductName 
       : null))
  )
  return r
}, {})

console.log(Object.values(result))
0 голосов
/ 11 декабря 2018

Вы можете использовать Array.prototype.find, Array.prototype.includes и Array.prototype.map, чтобы достичь этого очень изящно.

let data = [
   {
    "digital_assets": [
      {
        "id": "AA001",
        "url": "https://via.placeholder.com/150"
      },
      {
        "id": "AA002",
        "url": "https://via.placeholder.com/150"
      }
    ]
  },
  {
    "products": [
      {
        "id": ["BB001", "AA001"],
        "ProductName": "PROD 485"
      },
      {
        "id": ["BB002","AA002"],
        "ProductName": "PROD 555"
      }
    ]
  }
];

// Find the 'digital_assets' array
let assets = data.find(d => d['digital_assets'])['digital_assets'];

// Find the 'products' array
let products = data.find(d => d['products'])['products'];

// Return an array of composed asset objects
let details = assets.map(a => {
  return {
    id : a.id,
    url : a.url
    name : products.find(p => p.id.includes(a.id)).ProductName
  };
});

console.log(details);
0 голосов
/ 11 декабря 2018

изменил ответ в соответствии с вашими потребностями:

var data = [
       {
        "digital_assets": [
          {
            "id": "AA001",
            "url": "https://via.placeholder.com/150"
          },
          {
            "id": "AA002",
            "url": "https://via.placeholder.com/150"
          }
        ]
      },
      {
        "products": [
          {
            "id": ["BB001", "AA001"],
            "ProductName": "PROD 485"
          },
          {
            "id": ["BB002","AA002"],
            "ProductName": "PROD 555"
          }
        ]
      }
    ]
let matchingIds = [];
let data_assetsObject = data.find(element => {
    return Object.keys(element).includes("digital_assets")
})
let productsObject = data.find(element => {
    return Object.keys(element).includes("products")
})
data_assetsObject["digital_assets"].forEach(da => {
  productsObject["products"].forEach(product => {
    if (product.id.includes(da.id)){
      matchingIds.push({
        url: da.url,
        productName: product.ProductName
      })
    }
  })
})
console.log(matchingIds);

рабочая скрипка: https://jsfiddle.net/z2ak1fvs/3/

Надеюсь, что помог.Если вы не хотите использовать новый массив, вы также можете хранить соответствующие данные в элементе, через который вы проходите цикл.

Редактировать: Я думаю, я знаю, почему я получил отрицательное голосование.Мой пример работает, делая данные объектом, а не массивом.изменил фрагмент, чтобы показать это более четко.Почему данные в любом случае массив?Есть ли какая-то причина для этого, или вы можете просто преобразовать его в объект?

Изменить nr2: изменил код, чтобы соответствовать ожиданиям, как я понял, согласно вашим комментариям.теперь он использует вашу структуру данных, и независимо от того, что в данных, вы можете искать объекты, содержащие свойство digital_assets / products.

cheers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...