Как преобразовать массив в другой массив

При написании HTA вы должны думать асинхронно. Попробуйте переписать код, чтобы использовать window.setTimeout. В следующем примере я буду использовать window.setTimeout для создания звука колокола каждые 2 секунды:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="x-ua-compatible" content="ie=8">
<title>Bell Test</title>
<script language="VBScript">
Option Explicit
Dim objWShell
Set objWShell = CreateObject("WScript.Shell")
Sub DoPing
    divText.innerText = Now
    objWShell.Run "%COMSPEC% /c ECHO " & Chr(7), 0, False
    window.setTimeOut "DoPing", 2000
End Sub
Sub window_OnLoad
   window.ResizeTo 240,130
   DoPing
End Sub
</script>
</head>
<body>
<div id="divText">TEST</div>
</body>
</html>
4
задан sreginogemoh 17 January 2019 в 06:27
поделиться

6 ответов

Вы можете использовать reduce и деструктуризацию следующим образом:

Идея состоит в том, чтобы создать объект с key как свойство name и значение в качестве конечных объектов, которые вам нужны в выводе. Таким образом, вы можете просто использовать Object.values для получения окончательного массива:

const arr=[{name:"aa",type:"total",count:28394},{name:"aa",type:"featured",count:4},{name:"aa",type:"noAnswers",count:5816},{name:"ba",type:"total",count:148902},{name:"ba",type:"featured",count:13},{name:"ba",type:"noAnswers",count:32527},{name:"cc",type:"total",count:120531},{name:"cc",type:"featured",count:6},{name:"cc",type:"noAnswers",count:24170}];

const merged = arr.reduce((acc,{name,type,count}) =>
  ((acc[name] = acc[name] || {name})[type] = count, acc)
,{})

console.log(Object.values(merged))

This эквивалентно:

const arr=[{name:"aa",type:"total",count:28394},{name:"aa",type:"featured",count:4},{name:"aa",type:"noAnswers",count:5816},{name:"ba",type:"total",count:148902},{name:"ba",type:"featured",count:13},{name:"ba",type:"noAnswers",count:32527},{name:"cc",type:"total",count:120531},{name:"cc",type:"featured",count:6},{name:"cc",type:"noAnswers",count:24170}];

/* Our goal is to create a merged object like this:
{
  "aa": {
    "name": "aa",
    "total": 28394,
    "featured": 4,
    "noAnswers": 5816
  },
  "ba": {
    "name": "ba",
    "total": 148902,
    ....
  },
  "cc": {
    "name": "cc",
     ......
  }
}

The advantage of using object accumulator is we can access it like this: acc[name]
*/

const merged = arr.reduce((acc, {name,type,count} /*Destructuring*/) => {
  /* if the accumulator doesn't have the current "name" key, 
   create new object
   else use the existing one;
   {name} is same as {name: name}
  */
  acc[name] = acc[name] || {name};
  
  /* To the inner object, 
      add a key with the "type" value and assign it to "count" value
  */
  acc[name][type] = count;
  
  // return the accumulator
  return acc;
}, {})

// use Object.values to get the value part of the merged obejct into an array
console.log(Object.values(merged))

0
ответ дан adiga 17 January 2019 в 06:27
поделиться

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

const arr = [
  { name: "aa", type: "total", count: 28394 },
  { name: "aa", type: "featured", count: 4 },
  { name: "aa", type: "noAnswers", count: 5816 },
  { name: "ba", type: "total", count: 148902 },
  { name: "ba", type: "featured", count: 13 },
  { name: "ba", type: "noAnswers", count: 32527 },
  { name: "cc", type: "total", count: 120531 },
  { name: "cc", type: "featured", count: 6 },
  { name: "cc", type: "noAnswers", count: 24170 }
];

let result = [];
for( var i = 0; i < arr.length; i++)
{
   let data = {};
   if( arr[i].type == 'total')
   {
      data.name = arr[i].name;
      data.total = arr[i].count;
      data.featured = arr[i+1].count;
      data.noAnswers = arr[i+2].count;
      result.push(data);
   }
}

console.log(result);

0
ответ дан Sudhir Ojha 17 January 2019 в 06:27
поделиться

Вы можете попробовать что-то вроде этого:

Идея:

  • Создать hashMap, чтобы вы могли группировать объекты с помощью name.
  • Затем добавьте необходимые свойства в эту группу.
  • Наконец, переберите ключи и создайте конечный объект с добавленным свойством name.

const arr = [ { name: "aa", type: "total", count: 28394 }, { name: "aa", type: "featured", count: 4 }, { name: "aa", type: "noAnswers", count: 5816 }, { name: "ba", type: "total", count: 148902 }, { name: "ba", type: "featured", count: 13 }, { name: "ba", type: "noAnswers", count: 32527 }, { name: "cc", type: "total", count: 120531 }, { name: "cc", type: "featured", count: 6 }, { name: "cc", type: "noAnswers", count: 24170 } ];

const hashMap = arr.reduce((acc, item) => {
  acc[item.name] = acc[item.name] || {};
  acc[item.name][item.type] = item.count;
  return acc;
}, {});

const result = Object.keys(hashMap).map((name) => Object.assign({}, {name}, hashMap[name] ));

console.log(result)

<час>

Работа:

То, что я делаю, это Я создаю новый объект для каждого нового name. Итак, это: acc[item.name] = acc[item.name] || {}; проверяет, является ли запись недоступной или нет.

  • Если недоступно, вернуть новый объект.
  • Если доступно, вернуть ссылку на тот же объект.

Так что для любого данного имени вы будете ссылаться только на один и тот же объект.

Теперь это: acc[item.name][item.type] = item.count устанавливает свойства. Поскольку мы ссылаемся на один и тот же объект, вы устанавливаете свойство в одном месте. Так что, если у вас есть повторяющиеся записи, скажем,

[
    { name: "aa", type: "total", count: 28394 },
    { name: "aa", type: "total", count: 123},
]

output будет иметь вместо total: 123.

Итак, в конце у вас есть такая структура:

{
  aa: {
    total: <something>,
    feature: <something>,
    ...
  }
}

Теперь все, что вам нужно сделать, это объединить имя в этом объекте и вернуть значение. Вы также можете создать объект со свойством name по умолчанию ( как сделано adiga ). Это то, что я не думал, отвечая. Так что зачисление вместо ответа.

0
ответ дан Rajesh 17 January 2019 в 06:27
поделиться

const arr = [
  { name: "aa", type: "total", count: 28394 },
  { name: "aa", type: "featured", count: 4 },
  { name: "aa", type: "noAnswers", count: 5816 },
  { name: "ba", type: "total", count: 148902 },
  { name: "ba", type: "featured", count: 13 },
  { name: "ba", type: "noAnswers", count: 32527 },
  { name: "cc", type: "total", count: 120531 },
  { name: "cc", type: "featured", count: 6 },
  { name: "cc", type: "noAnswers", count: 24170 }
];

const names = [...new Set(arr.map(item => item.name))]
const output = {};

names.forEach(name => {output[name] = {}});

arr.forEach(item => {
  output[item.name][item.type] = item.count
});

const result = Object.entries(output).map(([name, rest]) => ({name, ...rest}))
console.log(result);

const arrResult = [
  { name: "aa", total: 28394, featured: 4, noAnswers: 5816 },
  { name: "ba", total: 148902, featured: 13, noAnswers: 32527 },
  { name: "cc", total: 120531, featured: 6, noAnswers: 24170 }
];

0
ответ дан Nikita Malyschkin 17 January 2019 в 06:27
поделиться

Вы можете использовать find оператор javascript, чтобы получить нужную строку из arrResult. Измените ваш код, как показано ниже:

for(const key of unique) {
  let result = arr.filter(x => {
    return x.name === key;
  });
  var currResult = arrResult.find(x => x.name == key);
  output.push({
    name: key,
    // need to get the rest of the properties here
    total: currResult.total,
    featured: currResult.featured,
    noAnswers: currResult.noAnswers
  });
}

JSFiddle: https://jsfiddle.net/ashhaq12345 / z8royg5w /

0
ответ дан Ashique 17 January 2019 в 06:27
поделиться
var op = {name : key};

  for(i=0; i < result.length; i++){
    op[result[i].type] = result[i].count;
  }

  output.push(op);

просто добавив это будет работать нормально. Однако ваш код не самый эффективный. Хеширование на основе имени сделает это быстрее

const arr = [
  { name: "aa", type: "total", count: 28394 },
  { name: "aa", type: "featured", count: 4 },
  { name: "aa", type: "noAnswers", count: 5816 },
  { name: "ba", type: "total", count: 148902 },
  { name: "ba", type: "featured", count: 13 },
  { name: "ba", type: "noAnswers", count: 32527 },
  { name: "cc", type: "total", count: 120531 },
  { name: "cc", type: "featured", count: 6 },
  { name: "cc", type: "noAnswers", count: 24170 }
];

let output = [];

const unique = [...new Set(arr.map(item => item.name))];

for(const key of unique) {
  let result = arr.filter(x => {
    return x.name === key;
  });
  
  var op = {name : key};
  
  for(i=0; i < result.length; i++){
    op[result[i].type] = result[i].count;
  }
  
  output.push(op);
}

console.log(output);

Ниже представлен наиболее эффективный способ сделать это: 1110]

const arr = [
      { name: "aa", type: "total", count: 28394 },
      { name: "aa", type: "featured", count: 4 },
      { name: "aa", type: "noAnswers", count: 5816 },
      { name: "ba", type: "total", count: 148902 },
      { name: "ba", type: "featured", count: 13 },
      { name: "ba", type: "noAnswers", count: 32527 },
      { name: "cc", type: "total", count: 120531 },
      { name: "cc", type: "featured", count: 6 },
      { name: "cc", type: "noAnswers", count: 24170 }
    ];
 
 var hash = {};
 var result = [];
 
 for(var i=0; i < arr.length; i++){
  if(!arr[i].name in hash)
    hash[arr[i].name] = {}
  let temp = {};
  temp[arr[i].type] = arr[i].count;
  hash[arr[i].name] = Object.assign(temp, hash[arr[i].name]);  
 }
 
 for(var key in hash)
  result.push({name : key, ...hash[key]})
  
console.log(result)
 

0
ответ дан Prajval M 17 January 2019 в 06:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: