地图2彼此的对象数组,但不同的lenght


arr1 = [{
  date: "2017-4-01"
}, {
  date: "2017-4-02"
}, {
  date: "2017-4-03"
}, {
  date: "2017-4-04"
}]
arr2 = [{
  date: "2017-4-01",
  company: "apple"
}, {
  date: "2017-4-04",
  company: "google"
}]

我未能将ARR1和ARR2映射在一起。如何将ARR2的现有属性密钥分配给ARR1?输出应具有ARR1的长度。

预期结果

arr3 = [{
  date: "2017-4-01",
  company: "apple"
}, {
  date: "2017-4-02"
}, {
  date: "2017-4-03"
}, {
  date: "2017-4-04",
  company: "google"
}]

arr2可能像这样

const arr2 = [{
  date: "2017-4-01",
  company: "apple"
}, {
  date: "2017-4-04",
  company: "google"
},
{
  date: "2017-4-04",
  company: "tesla"
}
];

意味着它可能具有多个相同的日期,如果是这样的情况,则应该是一个数组而不是字符串。

您可以将 Map用于 arr2,并使用 Object.assign用于属性的任意计数。

var arr1 = [{ date: "2017-4-01" }, { date: "2017-4-02" }, { date: "2017-4-03" }, { date: "2017-4-04" }],
    arr2 = [{ date: "2017-4-01", company: "apple", foo: 24 }, { date: "2017-4-04", company: "google" }],
    map = new Map(arr2.map(o => [o.date, o])),
    result = arr1.map(o => Object.assign({}, o, map.get(o.date) || {}));
    console.log(result);

您可以使用filter()map()的组合。

如果您还有其他属性,则只需更改if (filteredArray.length > 0)的主体。

arr2不需要排序

const arr1 = [{date: "2017-4-01"}, {date: "2017-4-02" }, {date: "2017-4-03"=}, {date: "2017-4-04"}];
const arr2 = [{date: "2017-4-01", company: "apple"}, {date: "2017-4-04",company: "google"}, {date: "2017-4-04",company: "tesla" }];
const arr3 = arr1.map(el => {
  const filteredArray = arr2.filter(e => e.date === el.date)
  if (filteredArray.length > 0) {
    let company;
    if (filteredArray.length === 1) {
        company = filteredArray[0].company
    } else {
        company = filteredArray.map(e => e.company);
    }
    return {date: el.date, company: company};
  }
  
  return el;
})
console.log(arr3)

您可以使用 map()find()与同一日期匹配对象。

var arr1 = [{date: "2017-4-01"}, {date: "2017-4-02"}, {date: "2017-4-03"}, {date: "2017-4-04"}]
var arr2 = [{date: "2017-4-01",company: "apple"}, {date: "2017-4-04",company: "google"}]
var result = arr1.map(function(e) {
  var f = arr2.find(a => a.date == e.date);
  return f ? e = Object.assign({}, e, f) : e;
})
console.log(JSON.stringify(result, 0, 4))

另一种方法是创建一个对象作为哈希表并使用它来检查日期。

var arr1 = [{date: "2017-4-01"}, {date: "2017-4-02"}, {date: "2017-4-03"}, {date: "2017-4-04"}]
var arr2 = [{date: "2017-4-01",company: "apple"}, {date: "2017-4-04",company: "google"}]
var hash = {}
arr2.forEach(e => hash[e.date] = e);
var result = arr1.map(function(e) {
  return hash[e.date] ? e = Object.assign({}, e, hash[e.date]) : e;
})
console.log(JSON.stringify(result, 0, 4))

更新:如果对象日期多次重复多次将数组创建为属性值。

var arr1 = [{"date":"2017-04-01"},{"date":"2017-04-02"},{"date":"2017-04-03"},{"date":"2017-04-04"},{"date":"2017-04-05"},{"date":"2017-04-06"},{"date":"2017-04-07"},{"date":"2017-04-08"},{"date":"2017-04-09"},{"date":"2017-04-10"},{"date":"2017-04-11"},{"date":"2017-04-12"},{"date":"2017-04-13"},{"date":"2017-04-14"},{"date":"2017-04-15"},{"date":"2017-04-16"},{"date":"2017-04-17"},{"date":"2017-04-18"},{"date":"2017-04-19"},{"date":"2017-04-20"},{"date":"2017-04-21"},{"date":"2017-04-22"},{"date":"2017-04-23"},{"date":"2017-04-24"},{"date":"2017-04-25"},{"date":"2017-04-26"},{"date":"2017-04-27"},{"date":"2017-04-28"},{"date":"2017-04-29"},{"date":"2017-04-30"}]
var arr2 = [{"date":"2017-04-23","company_id":"123","company_name":"Pancong Bro"},{"date":"2017-04-23","company_id":"345","company_name":"Le Meridien - Kuala Lumpur"},{"date":"2017-04-18","company_id":"567","company_name":"Three Little Birds Coffee"},{"date":"2017-04-18","company_id":"778","company_name":"Await Cafe"},{"date":"2017-04-18","company_id":"234","company_name":"TOKB CAFE"},{"date":"2017-04-14","company_id":"190","company_name":"Sakae Sushi - Sunway Pyrammid"},{"date":"2017-04-23","company_id":"008","company_name":"sold out Bangsar South"},{"date":"2017-04-19","company_id":"255","company_name":"Greyhound Cafe"}]
var hash = {}
arr2.forEach(function(e) {
  if (!hash[e.date]) {
    hash[e.date] = e
  } else {
    Object.keys(e).forEach(function(key) {
      var prop = hash[e.date][key]
      if (prop && key != 'date') {
        if (typeof prop == 'string') {
          hash[e.date][key] = [prop].concat(e[key])
        } else {
          prop.push(e[key])
        }
      } else {
        prop = e[key];
      }
    })
  }
});
var result = arr1.map(function(e) {
  return hash[e.date] ? e = Object.assign({}, e, hash[e.date]) : e;
})
console.log(JSON.stringify(result, 0, 4))

最新更新